PHP $ _FILES为空,获取表格数据

时间:2019-07-10 22:35:24

标签: php fetch multipartform-data

我正在尝试使用网络抓取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。无论在前端还是后端,我都没有收到任何错误消息。

1 个答案:

答案 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”。