【问题标题】:HTML5 File API - Send file to server for processingHTML5 File API - 将文件发送到服务器进行处理
【发布时间】:2015-02-13 01:10:27
【问题描述】:

我有以下表格:

<form>
    ...
    <input type="file" multiple="multiple" id="images" />
    <a id="add">Add</a>
    ...
    <input type="submit" value="Submit" />
</form>

添加元素的点击事件然后像这样连接起来:

var images = [];

$("#add").click(function() {
    var files = $("#images")[0].files;

    for (var i = 0; i < files.length; i++) {
        images.push[files[i];
    }

    $("#images").val("");
});

这允许我添加来自多个位置的图像。现在我需要将文件发送回服务器。我发现了以下问题:

Passing path to uploaded file from HTML5 drag & drop to input field

这似乎是相似的。因此,我在提交表单时使用了以下内容来连接事件:

var form = $("form");

form.submit(function() {
    for (var i = 0; i < images.length; i++) {
        var reader = new FileReader();

        reader.onload = function(e) {
            $("<input>").attr({ type: "hidden", name: "images[]" }).val(e.target.result).appendTo(form);
        };

        reader.readAsDataURL(images[i]);
    }
});

最后在服务器上我有以下代码:

print_r($_POST);
print_r($_FILES);

但是,这两个集合都不包含提交图像的项目。我想知道我做错了什么?谢谢

【问题讨论】:

  • 您是否有多个具有相同 id 的商品?如果是这样,你需要改变它。 HTML 页面中不允许有重复的 ID。
  • 不,我只有一个名为 images 的元素。我也用不同的名称对此进行了测试,但似乎没有任何效果。
  • 控制台有错误吗?例如这条线images.push[files[i]; 不好。
  • 看起来您实际上并未使用正在创建的那些 FileReader 对象读取任何文件,因此将输入元素附加到表单的 onload 事件实际上可能不会触发。
  • 不,没有 javascript 错误。我还使用开发人员工具逐步完成了它,并为表单提交时添加的每个图像正确执行了 onload 事件。

标签: javascript php jquery html


【解决方案1】:

好的,我认为您的问题是由FileReaderload 事件处理程序引起的,该事件处理程序将这些数据 URL 附加到表单,在表单提交到之后被调用 服务器。

您可以解决这个问题,并通过将这些项目添加到“添加”链接的click 处理程序的表单中来消除多余的images 变量和submit 事件处理程序。您还可以利用这个机会进行一些客户端验证,防止重复的数据 URL 上传到服务器,甚至为所选图像添加预览/删除选项。

此外,您可以通过将其click 处理程序替换为附加到您的file 输入的change 处理程序来取消添加链接。

编辑(nfplee):

var images = [];

$("#add").click(function() {
    var files = $("#images")[0].files;

    for (var i = 0; i < files.length; i++) {
        var reader = new FileReader();

        reader.onload = (function(file) {
            return function(e) {
                images.push({ name: file.name, file: e.target.result });
            };
        })(files[i]);

        reader.readAsDataURL(files[i]);
    }

    $("#images").val("");
});

var form = $("form");

form.submit(function() {
    for (var i = 0; i < images.length; i++) {
        $("<input>").attr({ type: "hidden",
            name: "images[" + i + "][name]" }).val(images[i].name).appendTo(form);
        $("<input>").attr({ type: "hidden",
            name: "images[" + i + "][file]" }).val(images[i].file).appendTo(form);
    }
});

【讨论】:

  • 谢谢@Aaraon。您的回答帮助我指出了正确的方向。我不确定您是否完全正确,但我发现通过将 FileReader 的加载事件移动到图像更改或添加单击事件处理程序工作正常。我猜提交表单时 FileReader 不起作用。但是无论如何,它现在看起来更干净了。图片集合的原因是我实际上使用了一个 javascript 模板引擎来观察集合并在更新时更新 ui。我将使用最终代码编辑您的答案。
  • 太棒了!我很高兴你让它工作。 FWIW,我认为初始方法的问题更多地与 JavaScript 调度事件和执行其处理程序的顺序有关,而不是与 FileReader 对象本身有关。您正在侦听的那些load 事件被添加到事件队列之后 submit 事件,其中侦听器绑定到那些FileReaders。任何有兴趣的人都可以在javascript.info/tutorial/events-and-timing-depth 获得有关 JavaScript 事件计时的方便复习。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-26
  • 1970-01-01
  • 1970-01-01
  • 2012-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多