【问题标题】:Is it possible to read object from AJAX request on server side?是否可以从服务器端的 AJAX 请求中读取对象?
【发布时间】:2021-10-23 03:03:37
【问题描述】:

实际上,我正在尝试以 base64 格式发送视频文件,但文件很大(小文件可以正常工作),这就是为什么 ajax 进程未完成并且出现 400 错误的原因。

所以,我想像下面这样发送一个文件对象,我可以从服务器端读取这个对象。但是不知道有没有可能?或者有什么方法可以处理大型视频文件上传?

[object FileReader]

这是我的 AJAX 代码

var reader = new FileReader();
// this function is triggered once a call to readAsDataURL returns
reader.onload = async function(event){
   var fileData = new FormData();
    var fileType;
    fileType = ".avi";
    // console.log(my_script_vars.postID);
    // fileData.append("file", event.target);
    fileData.append("file", event.target.result);
    fileData.append("action", "myaction");
    fileData.append("filetype", fileType);
    fileData.append("post_id", my_script_vars.postID);
    
    jQuery.ajax({
        url: 'https://www.reelme.app/sign-up/wp-admin/admin-ajax.php',
        processData: false,
        contentType: false,
        cache: false,
        data: fileData,  
        type: 'POST',
        .......
        .......
        .......
    });
}

请帮忙。提前致谢。

【问题讨论】:

  • 您可以将 javascript 对象作为 JSON 对象发送到服务器。您是否尝试过使用 JSON.stringify(object)?
  • 是的,我试过 JSON.stringify(object) 但没有运气。实际上,如果我们传递 javascript 数组 JSON.stringify(array) ,这种方式有效,但这就是为什么我遇到同样的大文件 400 错误
  • 也许increasing maximum post size 可能会有所帮助。
  • 已经这样做了。但没有运气。
  • 能否检查ajax调用中的url是否正确?

标签: javascript php html jquery wordpress


【解决方案1】:

您不应该将文件读入 base64 并将所有内容存储在内存中。搞砸你的 FileReader。

您正在使用 FormData 做正确的事情,但 FormData 也可以附加 blob 和文件

// Simulate a file you would normally get from a file input or drag n drop
const file = new File(['abc'], 'sample.txt', { type: 'text/plain' })

const fd = new FormData()
fd.append('file', file)

然后上传它,我建议您使用 fetch 而不是需要所有这些 processData 和其他配置的 jQuery

const url = 'https://www.reelme.app/sign-up/wp-admin/admin-ajax.php'
fetch(url, { method: 'POST', body: fd })
  .then(console.log, console.error)

JSON 不适合处理大型二进制数据... b/c 它不是好的流格式。

【讨论】:

  • 谢谢兄弟。我已经像你描述的那样做了。我使用了下面的代码。
  • function dataURLtoFile(dataurl, filename) { var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1] , bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n); while(n--){ u8arr[n] = bstr.charCodeAt(n); } return new File([u8arr], filename, {type:mime}); }
猜你喜欢
  • 2016-10-02
  • 1970-01-01
  • 2019-06-01
  • 1970-01-01
  • 2017-01-23
  • 1970-01-01
  • 2018-02-06
  • 2019-04-01
  • 1970-01-01
相关资源
最近更新 更多