【问题标题】:Unable to get request.FILES django无法获取 request.FILES django
【发布时间】:2018-05-31 14:07:28
【问题描述】:

我正在尝试将文本文件上传到我的 django 后端,但我的 request.FILES 始终为空。

我正在使用 axios 发送文件,并遵循 django 要求将“multipart/form-data”作为请求的内容类型。

我错过了什么?

在我的 app.js 上,我通过以下方式发送发布请求:

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]);
        }
    },
}

关于网络请求负载:

------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: {}>

【问题讨论】:

  • 那个 JS 函数是什么的一部分?即this 是什么?您可能需要从输入元素中获取实际文件,例如this.uploadedFile.files[0]
  • 它是 vue 对象的一部分。我更新了代码 sn-p 以包含 vue 实例化。
  • 您正在尝试保存 base64 图像。阅读:stackoverflow.com/questions/39576174/…
  • @Farrukh 我正在发送一个文本文件

标签: django vue.js django-forms axios


【解决方案1】:

它表示您的图像编码为 base64

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

【讨论】:

    【解决方案2】:

    我现在可以读取文件内容了。

    我使用了 Farrukh 评论中的链接 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 包含我需要的文件中的字符串。

    【讨论】:

      猜你喜欢
      • 2012-06-06
      • 1970-01-01
      • 2012-03-25
      • 2020-08-17
      • 1970-01-01
      • 2013-03-23
      • 1970-01-01
      • 2019-01-26
      • 2018-10-17
      相关资源
      最近更新 更多