【发布时间】:2017-07-17 08:19:49
【问题描述】:
我正在使用 Django Rest Framework 和 Angular 2 上传文件。我的文件看起来像这样。 我做错了什么?请告诉我。非常感谢。
Django 文件:
查看
class ProjectTaskViewSets(viewsets.ModelViewSet):
queryset = ProjectTask.objects.all()
serializer_class = ProjectTaskSerializers
parser_classes = (MultiPartParser, FormParser,)
def perform_create(self, serializer, format=None):
file = self.request.data.get('file', False)
if file:
serializer.save(
text=serializer.validated_data.get('text'),
project=serializer.validated_data.get('project'),
file=file)
else:
serializer.save(
text=serializer.validated_data.get('text'),
project=serializer.validated_data.get('project')
)
def filter_queryset(self, queryset):
project = self.request.query_params.get('project', False)
if project:
queryset = queryset.filter(project_id=project)
return queryset
序列化器
class ProjectTaskSerializers(serializers.ModelSerializer):
class Meta:
model = ProjectTask
fields = '__all__'
def create(self, validated_data):
return ProjectTask.objects.create(**validated_data)
模型
class ProjectTask(models.Model):
text = models.CharField(_('text'), max_length=200, blank=True, null=True)
file = models.FileField(
_('file'), blank=True, null=True, upload_to=directory_path
)
project = models.ForeignKey(
DashboardProject,
verbose_name=_('project'),
related_name='task_list',
on_delete=models.CASCADE
)
class Meta:
verbose_name = _('project task')
verbose_name_plural = _('project tasks')
ordering = ('-id',)
def __str__(self):
return self.text[:20]
def __repr__(self):
return '<ProjectTask {}>'.format(self.text[:20])
角度文件
组件
saveTask() {
this.taskForm.value.file = this.file;
console.log(this.taskForm.value);
this.taskService.addTask(this.file).subscribe(
(data) => {
console.log(data)
},
(error) => {
console.log(error)
}
);
}
onChange(event) {
let files = event.target.files;
console.log(files);
let formData: FormData = new FormData();
formData.append('file', files[0], files[0].name);
//if (files.length > 0) {
// let formData: FormData = new FormData();
// for (let file of files) {
// formData.append('files', file, file.name);
// }
console.log(formData);
this.file = formData
}
服务
addTask(model:any): Observable<TaskId> {
let headers = new Headers();
headers.set('Accept', 'application/json');
// headers.set('Authorization', 'JWT ' + localStorage.getItem('id_token'));
// headers.set('Content-Type', 'multipart/form-data' );
// headers.set('Content-Type', 'application/json' );
headers.set('Content-Type', '*/*' );
let options = new RequestOptions({ headers: headers });
return this.http.post(URL, model, options).map((response: Response) => response.json());
}
输入
<input type="file" id="file" name="file" formControlName="file" (change)="onChange($event)">
【问题讨论】:
-
您是否遇到任何错误?如果是,请发布它们!
-
Object { _body: "{"detail":"Multipart form parse error - Invalid boundary in multipart: None", status: 400, ok: false, statusText: "Bad Request", headers: Object ,类型:2,网址:“127.0.0.1:8000/api/task”}
标签: python django rest angular file-upload