使用base64编码文本而不是multipart / form-data上传文件 - 好主意?

时间:2013-05-28 13:37:10

标签: javascript html django

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

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

我可以想到一种方法 - 将FileField替换为TextField,并将base64编码的文件作为文本传递,但我不确定它是否可以使用{{1}}。一个很好的解决方案。

4 个答案:

答案 0 :(得分:1)

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

base64编码可能无济于事

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

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

  2. 它将占用大量带宽。

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

答案 3 :(得分:0)

我最近遇到了一个问题,我必须实现一个解决方案,用户可以上传文档,将其传输到服务器,而不存储在服务器上,将流发布到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]来为多个文件工作。

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