【问题标题】:Filepond input field not attached with formdata while sending发送时未附加formdata的Filepond输入字段
【发布时间】:2020-12-21 23:42:14
【问题描述】:

如何将 FilePond 文件字段与其他表单元素一起上传到服务器。例如,我有一个表单元素,其中包含输入字段、选择字段、文本区域和连接到 Filepond 插件的文件输入字段。

<form class="uploadform">
    <input type="text" placeholder="type the title of the document you are uploading">
    <textarea class="textarea" placeholder="type anything here"></textarea>
    <input type="file" class="filepond" name="file[]" multiple>
    <button type="button" class="uploadbtn">Upload Document</button>
</form>

但是,每当我尝试上传表单时,文件字段不会随它一起上传到服务器,请帮助我解决这个问题。如何将 FilePond 输入字段绑定到我的 formdata 元素?

这是我的 jQuery 上传代码:

$(".uploadbtn").click(function(){
    var form = document.getElementsByClassName("uploadform")[0] 
    var formdata = new FormData(form)
    $.ajax({
        url: "path/to/php-server-side/request/handler.php",
        data: formdata,
        processData: false,
        contentType: false,
        method:"post"
    }).done(function (response) {...
})

【问题讨论】:

  • 我认为您需要添加文件编码插件(这会将文件编码为 base64 字符串)。或者在 FilePond 上设置 server 属性,使其异步上传文件到服务器(filepond 输入字段现在将包含服务器上文件的唯一文件标识符)。有关更多信息,请参阅文档:pqina.nl/filepond/docs/patterns/plugins/file-encode
  • 我不想要异步上传,我试图手动上传到服务器,但提交表单时它没有附加到发布请求。

标签: javascript jquery ajax file-upload filepond


【解决方案1】:

您需要手动将 FilePond 文件附加到 FormData 对象。 FilePond 对象有一个 file 属性,它是原始文件 blob 对象。你可以这样:

$(document).ready(function(e){
pond = FilePond.create(
    document.querySelector('#file'), {
        allowMultiple: true,
        instantUpload: false,
        allowProcess: false
    });

$("#uploadform").submit(function (e) {
  e.preventDefault();
  var formdata = new FormData(this);
  // append FilePond files into the form data
  pondFiles = pond.getFiles();
  for (var i = 0; i < pondFiles.length; i++) {
      // append the blob file
      formdata.append('file[]', pondFiles[i].file);
  }

  $.ajax({
    url: "path/to/php-server-side/request/handler.php",
    data: formdata,
    dataType: 'JSON',
    processData: false,
    contentType: false,
    method:"post"
  }).done(function (response) {
    // todo
  });
 
})
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.js"></script>
<script src="https://unpkg.com/filepond/dist/filepond.min.js"></script>
<script src="https://unpkg.com/jquery-filepond/filepond.jquery.js"></script>
<link href="https://unpkg.com/filepond/dist/filepond.css" rel="stylesheet"/>
<script src="https://unpkg.com/filepond/dist/filepond.js"></script>

<form id="uploadform" enctype="multipart/form-data">
<input type="text" placeholder="type the title of the document you are uploading">
<br>
<textarea class="textarea" placeholder="type anything here"></textarea>
<input id="file" type="file" class="filepond" name="file">
<button type="submit" class="uploadbtn">Upload Document</button>
</form>

这样,您将获得文件,就好像它们是通过html 表单发送的一样。

【讨论】:

  • 好的,谢谢,后来我自己为我正在从事的项目开发了一个文件上传插件,将 blob 附加到 FormData 比 base64 编码的字符串更好,因为 blob 将作为文件请求发送,并且您将能够从 $_files 全局数组中检索它,就好像它是使用 html 表单文件输入提交的一样
  • @PaulosAb 听起来很有趣。我的答案是获取 FilePond 文件并将其与其他 FormData 字段一起发送。您的插件是否将 FilePond 文件作为 file 附加到 FormData?
  • 我的插件是一个独立的插件,我让它没有依赖关系,我用 100% vanilla javascript 构建,我没有构建它来使用文件池,你的答案很好,100%对,但是如果您可以将文件作为 blob 发送,它将由 php $_FILES 数组而不是 base64 字符串处理,您可以通过这样做将 base64 转换为 blob ----- var b64ToBlob = fetch(pond.getFiles ()[0].getFileEncodeBase64String()).then(res => res.blob())
  • @PaulosAb 我已经更新了使用 blob 而不是 base64 的答案 :)
  • @PaulosAb 是的,我做到了。
猜你喜欢
  • 1970-01-01
  • 2017-10-08
  • 2016-11-18
  • 2020-10-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-16
  • 2019-07-12
  • 2018-01-19
相关资源
最近更新 更多