【问题标题】:File upload using base64 encoded text instead of multipart/form-data - good idea?使用 base64 编码文本而不是 multipart/form-data 上传文件 - 好主意吗?
【发布时间】:2013-05-23 12:17:06
【问题描述】:

我目前有一个动态表单数量的 django formset。每个表单都有一个文件字段。

虽然这可行,但我需要一种方法来允许一次选择多个文件。我可以用input type='file' multiple='multiple' 做到这一点,我可以用FileReader 读取文件数据。但是如何将这些文件传递给 django formset 而不是 form-0-fileform-1-file 等?

我可以想到一种方法——将FileField 替换为TextField,并将base64 编码文件作为文本传递,但我不确定这是否是一个好的解决方案。

【问题讨论】:

    标签: javascript html django


    【解决方案1】:

    只需使用多个属性并使用 FILES 即可获取所有上传的文件。

    base64 编码可能无济于事

    【讨论】:

      【解决方案2】:

      使用multiple='multiple' 与表单集或单一表单无关。它将与 django 一起工作。因此,如果您打算使用单个表单而不是表单集,只需输入 multiple 属性,然后访问 request.FILES 即可获取所有上传的文件。

      【讨论】:

      • 谢谢,看起来是唯一的好方法。我正在尝试找到一种方法让 django formset 接受这个文件列表。
      【解决方案3】:

      您应该将图像存储为文件,(Here are some good answers to do that)

      我已经尝试过以这种方式存储图像,但它有很多问题:

      1. 每次你去那个页面,它都会重新开始加载图片,人们不想每次都加载同一张图片。

      2. 会占用大量带宽。

      3. 如果您使用免费的网络托管服务,将在几个小时内耗尽您所有的带宽,或者当您存储 50 张图片时,这意味着您的网站将在整个月内关闭,甚至提供无限托管和带宽的服务,强制执行每月带宽。

      【讨论】:

        【解决方案4】:

        我最近遇到了一个问题,我必须实现一个解决方案,让用户可以上传文档,将其流式传输到服务器,并且无需存储在服务器上,而是将流发布到 SOAP 服务器。

        我的实现方式如下:

        我想通过 AJAX 上传文件,以便显示上传进度。

        这是我的解决方案(请注意,这一次只满足一个文件 - 但它可能是一个起点。)

        JavaScript:

        首先为 FormData 声明一个对象 - 这将用于与文件一起发送任何附加信息:

        var formData = new FormData();
        

        第二次追加你想发送到服务器的所有数据:

        formData.append("documentDescription", $("#documentDescription textarea").val());
        formData.append("afile", file.files[0]);
        

        现在创建一个新的 XMLHttpRequest 实例:

        var xhr = new XMLHttpRequest();
        

        这是让一切正常工作的其余代码:

        xhr.open("POST", "UploadDocumentURL", true);
        xhr.upload.onprogress = function(e) {
                        if (e.lengthComputable) {
                                    var percentComplete = (e.loaded / e.total) * 100;
                                    $('.progress .bar').css('width', percentComplete + '%').attr('aria-valuenow', percentComplete);
                                }
                            }
        
        xhr.onload = function() {
                                if (this.status == 200) {
                                    var resp = JSON.parse(this.response);
                                    if (resp.type === "error") {
                                        notify.add(resp.type, "Error", resp.message, 3000, true);
                                    } else {
                                        notify.add(resp.type, "Success", resp.message, 3000);
                                    }
                                }
                                ;
                            };
        
        xhr.send(formData);
        

        PHP

        $documentName = $_POST["documentDescription"];
        $fileName = $_FILES['afile']['name'];
        $fileType = $_FILES['afile']['type'];
        $ext = pathinfo($fileName, PATHINFO_EXTENSION);
        $fileName = pathinfo($fileName, PATHINFO_FILENAME);
        $fileContent = file_get_contents($_FILES['afile']['tmp_name']);
        

        您现在将在服务器上拥有二进制数据。

        您应该能够通过在 JavaScript 中循环使用 file.files[0] 来为多个文件执行此操作。

        希望您可以将此应用于您的问题。

        【讨论】:

          猜你喜欢
          • 2013-08-16
          • 2010-10-07
          • 2015-10-23
          • 1970-01-01
          • 1970-01-01
          • 2017-07-28
          • 1970-01-01
          • 1970-01-01
          • 2016-01-27
          相关资源
          最近更新 更多