2017-12-18 238 views
1

我想上传一个文本文件到我的django后端,但我的request.FILES始终是空的。无法获得request.FILES django

我正在使用axios发送文件并按照django的要求将'multipart/form-data'作为请求的内容类型。

我缺少什么?

new Vue({ 
    el: '#app', 
    data: { 
     reqtype: '', 
     uploadedFile: '', 
    }, 
    methods: { 
     onSubmit(event) { 
      this.submitLoading = true; 
      if (! this.validateForm(this)) { 
       event.preventDefault(); 
       this.submitLoading = false; 
       return; 
      } 
      var formData = new FormData(); 
      formData.append("reqtype", this.reqtype) 
      formData.append('fileToUpload', this.uploadedFile) 
      axios.post('/sreqtool/tc/', formData, { 
       headers: { 
        'Content-Type': 'multipart/form-data' 
       } 
      }) 
     }, 
     onFileChange(e) { 
      var files = e.target.files || e.dataTransfer.files; 
      if (!files.length) 
       return; 

      var reader = new FileReader(); 
      var vm = this; 

      reader.onload = (e) => { 
       vm.uploadedFile = e.target.result; 
      }; 

      reader.readAsDataURL(files[0]); 
     } 
    }, 
} 

在网络上请求有效载荷:

在我app.js我经由发送POST请求

------ WebKitFormBoundarymAnl54hGVTifZzwM内容处置:形状数据; NAME = “reqtype”

基于文件

------ WebKitFormBoundarymAnl54hGVTifZzwM内容处置:形状数据; NAME = “fileToUpload”

数据:text/plain的; BASE64,OTA1NTIzMzg2NQ0KOTE3NTAwMTU0Mg0KOTc3NDczNjcyNg0KMTIzNTQ2ODQ1Ng == ------ WebKitFormBoundarymAnl54hGVTifZzwM--

在我的views.py我有:

@csrf_exempt 
def index(request): 
    if request.method == 'POST': 
     DLOG.info(request.POST) 
     DLOG.info(request.FILES) 
     form = ExtractForm(request.POST, request.FILES) 

     if form.is_valid(): 
      res = QueryManager.processRequest(request.user, form.cleaned_data) 

DLOG是我的记录器,dlog的输出是:

[2017-12-18 16:51:06,510] INFO views index: <QueryDict: {u'fileToUpload': [u'data:text/plain;base64,OTA1NTIzMzg2NQ0KOTE3NTAwMTU0Mg0KOTc3NDczNjcyNg0KMT 
IzNTQ2ODQ1Ng=='], u'reqtype': [u'filebased']}> 
[2017-12-18 16:51:06,512] INFO views index: <MultiValueDict: {}> 
+2

什么是JS功能的一部分?即什么是“这个”?您可能需要从输入元素获取实际文件,如'this.uploadedFile.files [0]'。 –

+0

它是vue对象的一部分。我更新了代码片段以包含vue实例。 –

+1

您正在尝试保存base64图像。阅读此:https://stackoverflow.com/questions/39576174/save-base64-image-in-django-file-field – Farrukh

回答

0

它说你的我法师编码为base64

{u'fileToUpload': [u'data:text/plain;base64,OTA1NTIzMzg2NQ0KOTE3NTAwMT... 
0

我现在能够读取文件内容。

我用 stackoverflow answer

代码更新为从法鲁克的评论链接:

@csrf_exempt 
def index(request): 
    if request.method == 'POST': 
     form = ExtractForm(request.POST, request.FILES) 
    if form.is_valid(): 
     res = QueryManager.processRequest(request.user, form.cleaned_data) 
     format, imgstr = data.split(';base64,') 
     ext = format.split('/')[-1] 
     data = ContentFile(base64.b64decode(imgstr), name='temp.' + ext) 
     filetext = data.read() 

FILETEXT包含我从文件中需要的字符串。