我正在尝试使用网络抓取API和PHP上传文件。但是由于某种原因,文件没有从Web浏览器捕获(或发送到)服务器。我仍然可以发送带有curl的文件。
async function send_files(url, files) { // files = [File(), File(), ...], url = localhost
const formData = new FormData()
for (const file of files) {
formData.append('files[]', file)
}
var result = await fetch(url, {
method: 'POST',
cors: 'same-origin',
headers: {
'Content-Type': 'multipart/form-data'
},
body: formData
})
return await result.json()
}
在 PHP 中,如果我print_r($_FILES)
返回空数组。现在,我知道上传正在正常进行,这证实了这一点:
curl -k -X POST -c ... -b ... -H "Content-Type: multipart/form-data" -F "files[]=@file1" -F "files[]=@file2" ... https://localhost
我的网络的“网络”标签中的请求有效负载显示:
------WebKitFormBoundaryXXXXXXXXXXXXXXXX
Content-Disposition: form-data; name="files[]"; filename="file1"
Content-Type: text/plain
------WebKitFormBoundaryXXXXXXXXXXXXXXXX
Content-Disposition: form-data; name="files[]"; filename="file2"
Content-Type: text/plain
------WebKitFormBoundaryXXXXXXXXXXXXXXXX--
“网络”选项卡还显示我仅向服务器发送372 B信息,而两个文件的总大小为941B。无论在前端还是后端,我都没有收到任何错误消息。
答案 0 :(得分:0)
我设法解决了这个问题,但老实说,对我来说这毫无意义,同时使用Firefox和勇敢的浏览器进行了确认(认为可能与浏览器有关,而与浏览器无关)。
简单来说,我需要删除标题...
因此,呼叫看起来像:
async function send_files(url, files) { // files = [File(), File(), ...], url = localhost
const formData = new FormData()
for (const file of files) {
formData.append('files[]', file)
}
var result = await fetch(url, {
method: 'POST',
cors: 'same-origin',
//headers: { REMOVED
// 'Content-Type': 'multipart/form-data'
//},
body: formData
})
return await result.json()
}
我真的不明白为什么,但是从我看来,设置标题似乎改变了表单数据中的某些内容,从而阻止了数据的正确上传。即使我认为未设置标头也应默认将其设置为“ application / x-www-url-encoded”。