python - Django Rest Framework 和 Angular 2 文件上传

标签 python django rest angular file-upload

我正在使用 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])

Angular 文件

组件

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)">

最佳答案

我这样使用它: angular2-service(设置您需要的内容类型: here ):

  uploadFile(file, filename: string){
let headers = new Headers({ 'Content-Type': 'application/vnd.ms-excel'});
headers.append("X-CSRFToken", this.utils.getCookie('csrftoken'));
headers.append("Content-Disposition", "attachment; filename=" + filename);

let options = new RequestOptions({ headers: headers });
return this.http.put(this.connectorsUrl + 'manage-files/', file , options)
                .map(res => res.json())
                .catch(this.handleError);

}

在 Django View 中:

    def put(self, request, format=None):

    file_obj = request.FILES['file']

    self.logger.info('Uploading file')
    uploaded = bicloudreposervice.upload_file(request.user.username, file_obj)

    return out

如果您想使用 TempFiles 处理程序,请添加到设置中:

FILE_UPLOAD_HANDLERS = [
'django.core.files.uploadhandler.TemporaryFileUploadHandler',

]

关于python - Django Rest Framework 和 Angular 2 文件上传,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42473565/

相关文章:

python - mysql.connector.errors.DataError : 1406 (22001): Data too long for column

javascript - 是否可以从单独的 html 页面单击 html 页面上的按钮?

Python/Django AMQP?

rest - 哪个状态代码是正确的 404 或 400 以及何时使用它们中的任何一个?

python - 如何读取Python 2.7.6中特定行中的特定字符?

python - python 中的 knuth shuffle

java - 将我的自定义 http header 添加到 Spring RestTemplate 请求/扩展 RestTemplate

java Restful Web服务在POST操作中从文本框中获取数据

python - 如何将 numpy.argpartition 的输出应用于二维数组?

python - Django的manage.py同步数据库错误