【问题标题】:jQuery multiple file upload from scratchjQuery 多文件从头上传
【发布时间】:2015-04-27 10:09:35
【问题描述】:

我正在尝试使用新的 HTML5 multiple 属性在 jQuery 中实现多图像上传器。

我的代码如下:

<form action="file-upload.php" method="post" enctype="multipart/form-data">
    <input name="userfiles" type="file" multiple="multiple">
</form>

我使用的 JS 代码取自关于 SO 的讨论,如下:

 $('input[name=userfiles]').change(function() {
    var names = [];
    for (var i = 0; i < $(this).get(0).files.length; ++i) {
        names.push($(this).get(0).files[i].name);
        console.log(names[i]);
    }
 });

有了这个,我可以在控制台上打印我选择的文件名,但是如果我需要获取这些文件的确切 val() 怎么办?我尝试将 .name 替换为 .val(),但出现错误。

如果我希望能够使用 $.ajax 来处理每个文件,我认为我需要每个文件的 fakepath。如果这是正确的,我如何在发送 get 请求的 PHP 文件中循环它们以上传它们?

【问题讨论】:

    标签: javascript php jquery ajax upload


    【解决方案1】:

    如果你使用 jquery-file-upload 插件,你可以使用这个

    <input class="fileupload" type="file" name="file">
    

    $('.fileupload').each(function () {
      $(this).fileupload({
      //your code goes here
    })
    

    【讨论】:

      【解决方案2】:

      您不需要操作文件路径,在您的 ajax 调用中只需使用 File 并将其放入新的 FormData 中

      类似的东西:

       $.ajax({
      'type':'POST',
      'data': (new FormData()).append('file', $(this).get(0).files[i])
      

      HTML5 multiple file upload: upload one by one through AJAX

      【讨论】:

      • 按照@insanebits 的建议,通过data 发送整个表格不是更好吗?
      • 我不知道您为什么需要循环播放每个文件。如果您想添加进度条并逐个发送文件(如 gmail 附件),这是一个解决方案。如果您不在乎,只需一次性发送。
      • 我的目标是在 PHP 文件中执行:if (isset($_FILES['userfiles'])) 等等。我不需要显示进度条,但是如果我发送整个表格,我可以这样做吗?因为现在,它甚至似乎都没有进入if 语句。
      • (另外,在 ajax 调用中,我必须使用 processData: false 禁用 processData)
      • 转储 $_FILES 的内容或进行网络捕获以查看发送的内容。我的示例将在 $_FILES['file'] 中上传
      【解决方案3】:

      您可以使用 HTML5 FormData API。 https://developer.mozilla.org/en-US/docs/Web/Guide/Using_FormData_Objects

      var form = new FormData();
      for (var i = 0; i < $(this).get(0).files.length; ++i) {
          form.append('userfiles[]', $(this).get(0).files[i]);
      }
      
      // send form data with ajax
      $.ajax({
          url: 'url',
          type: "POST",
          data: form
      });
      

      或者,如果您不能使用 FormData,则有一种方法可以本地发送它: https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest#Submitting_forms_and_uploading_files

      【讨论】:

      • 谢谢。我是否需要将输入名称从userfiles 更改为userfiles[]
      • 是的,因为您使用的是多个选项
      • 我很难按名称选择输入,如果我使用$('input[name=userfiles[]]'),我会因为[]而收到错误
      • 没关系,通过$('input[name=userfiles\\[\\]]') 设法做到了。我会告诉你我是否会这样做:)
      猜你喜欢
      • 1970-01-01
      • 2011-03-26
      • 1970-01-01
      • 1970-01-01
      • 2014-12-31
      • 2014-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多