Javascript 使用base64编码文本而不是多部分/表单数据上传文件-好主意?

Javascript 使用base64编码文本而不是多部分/表单数据上传文件-好主意?,javascript,html,django,Javascript,Html,Django,我目前有一个django表单集,表单数量动态。每个表单都有一个文件字段 虽然这是可行的,但我需要一种允许同时选择多个文件的方法。我可以使用input type='file'multiple='multiple'来实现这一点,并且我可以使用FileReader读取文件数据。但是如何将这些文件传递给django formset,而不是form-0-file、form-1-file等 我可以想出一种方法——用TextField替换FileField,并将base64编码文件作为文本传递,但我不确定这是

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

虽然这是可行的,但我需要一种允许同时选择多个文件的方法。我可以使用
input type='file'multiple='multiple'
来实现这一点,并且我可以使用
FileReader
读取文件数据。但是如何将这些文件传递给django formset,而不是
form-0-file
form-1-file


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

使用
multiple='multiple'
与表单集或单个表单无关。它将与django在本地协同工作。因此,如果您计划使用单个表单而不是表单集,只需将
multiple
属性放入,然后访问request.FILES以获取所有上载的文件。

您应该将图像存储为文件

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

  • 每次你进入该页面,它都会再次开始加载图像,人们不希望每次都加载相同的图像

  • 它将占用大量带宽

  • 如果你使用的是免费的网络托管服务,你将在几个小时内,或者在你存储50张图片时,花费你所有的带宽,这意味着你的网站将在一个月内关闭,即使是提供无限托管和带宽的服务,也会增加每月的带宽


  • 只需使用多个属性,并使用文件来获得所有上传的文件


    base64编码可能没有帮助

    我最近遇到了一个问题,我必须实现一个解决方案,用户可以上传文档,将其流式传输到服务器,而无需在服务器上存储,将流式传输到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]
    ,您应该能够对多个文件执行此操作


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

    谢谢,看来这是唯一的好方法。我正在试图找到一种方法使django formset接受这个文件列表。