php-fpm: 上传文件时缺少一些 POST 数据
php-fpm: Some POST data missing when uploading a file
我在 Ubuntu 18.04 机器上使用 PHP 7.2 fpm 和 nginx,我遇到了表单数据丢失的问题。表单提交数据大致是这样的结构:
[
'video' => [
'translations' => [
'de' => [
'title' => 'string',
'subtitles' => 'upload field'
]
],
'posterFrame' => 'upload field'
'duration' => 'string'
]]
当我将上传字段留空时,整个表单数据都可以在 $_POST
中正确使用。但是,当我尝试在 posterFrame
字段中上传文件(大小为 10 kB)时,它按预期显示在 $_FILES
中,但 $_POST
仅包含列出的键在上传字段之前,即在示例中,translations
在$_POST
中可用,但缺少duration
(我还检查了php://input
, 这是空的).
所有相关的 php.ini
设置(max_post_size
、allow_file_uploads
等)看起来都不错,应用程序代码本身也不错,至少它可以在不同的 18.04 机器上运行(Apache/mod_php),所以我不知道这里可能是什么问题。 nginx
vhost 配置直接来自 Symfony 文档,php-fpm
配置是 Ubuntu 附带的配置。我检查过的任何错误日志中都没有任何内容(php-errors
、syslog
、nginx/error.log
等)。这里可能出了什么问题?
编辑:我刚刚注意到一件事:当我 post 表单时,我在 nginx/access.log
:
中得到这些行
[my client ip] - - [16/May/2018:14:56:52 +0000] "POST /backend/videos/edit/1162214/ HTTP/1.1" 500 11373 "http://[myserver]/backend/videos/edit/1162214/" "Mozilla/5.0"
[my client ip] - - [16/May/2018:14:56:52 +0000] "\xFF\xD8\xFF\xE0\x00\x10JFIF\x00\x01\x01\x01\x00H\x00H\x00\x00\xFF\xE1I%Exif\x00\x00II*\x00\x08\x00\x00\x00\x09\x00\x0F\x01\x02\x00\x06\x00\x00\x00z\x00\x00\x00\x10\x01\x02\x00\x0E\x00\x00\x00\x80\x00\x00\x00\x12\x01\x03\x00\x01\x00\x00\x00\x01\x00\x00\x00\x1A\x01\x05\x00\x01\x00\x00\x00\xA0\x00\x00\x00\x1B\x01\x05\x00\x01\x00\x00\x00\xA8\x00\x00\x00(\x01\x03\x00\x01\x00\x00\x00\x02\x00s32\x01\x02\x00\x14\x00\x00\x00\xB0\x00\x00\x00\x13\x02\x03\x00\x01\x00\x00\x00\x02\x003si\x87\x04\x00\x01\x00\x00\x00\xC4\x00\x00\x00X$\x00\x00Canon\x00Canon EOS 20D\x0033\x7F\xFF\xF5\xBB3333\xB7\xF7\xBF;\xB3;33H\x00\x00\x00\x01\x00\x00\x00H\x00\x00\x00\x01\x00\x00\x002018:05:06 18:33:31\x00\x1C\x00\x9A\x82\x05\x00\x01\x00\x00\x00\x1A\x02\x00\x00\x9D\x82\x05\x00\x01\x00\x00\x00\x22\x02\x00\x00\x22\x88\x03\x00\x01\x00\x00\x00\x02\x0073'\x88\x03\x00\x01\x00\x00\x00@\x06\xCC\xCC\x00\x90\x07\x00\x04\x00\x00\x000221\x03\x90\x02\x00\x14\x00\x00\x00*\x02\x00\x00\x04\x90\x02\x00\x14\x00\x00\x00>\x02\x00\x00\x01\x91\x07\x00\x04\x00\x00\x00\x01\x02\x03\x00\x01\x92" 400 182 "-" "-"
所以乍一看,我会说这是图像的二进制数据,以某种方式最终出现在请求中 URL?怎么会这样?
好的,在将设置转换为 Apache/mod_php 后,我注意到这台机器上没有安装 GD 扩展(在日志中得到一个 Call to undefined method imagecreatefromjepg
)。我安装了 GD,现在它可以正常工作了。不知道为什么 php-fpm
吞下了错误并在 nginx 中产生了这种奇怪的行为
我在 Ubuntu 18.04 机器上使用 PHP 7.2 fpm 和 nginx,我遇到了表单数据丢失的问题。表单提交数据大致是这样的结构:
[
'video' => [
'translations' => [
'de' => [
'title' => 'string',
'subtitles' => 'upload field'
]
],
'posterFrame' => 'upload field'
'duration' => 'string'
]]
当我将上传字段留空时,整个表单数据都可以在 $_POST
中正确使用。但是,当我尝试在 posterFrame
字段中上传文件(大小为 10 kB)时,它按预期显示在 $_FILES
中,但 $_POST
仅包含列出的键在上传字段之前,即在示例中,translations
在$_POST
中可用,但缺少duration
(我还检查了php://input
, 这是空的).
所有相关的 php.ini
设置(max_post_size
、allow_file_uploads
等)看起来都不错,应用程序代码本身也不错,至少它可以在不同的 18.04 机器上运行(Apache/mod_php),所以我不知道这里可能是什么问题。 nginx
vhost 配置直接来自 Symfony 文档,php-fpm
配置是 Ubuntu 附带的配置。我检查过的任何错误日志中都没有任何内容(php-errors
、syslog
、nginx/error.log
等)。这里可能出了什么问题?
编辑:我刚刚注意到一件事:当我 post 表单时,我在 nginx/access.log
:
[my client ip] - - [16/May/2018:14:56:52 +0000] "POST /backend/videos/edit/1162214/ HTTP/1.1" 500 11373 "http://[myserver]/backend/videos/edit/1162214/" "Mozilla/5.0"
[my client ip] - - [16/May/2018:14:56:52 +0000] "\xFF\xD8\xFF\xE0\x00\x10JFIF\x00\x01\x01\x01\x00H\x00H\x00\x00\xFF\xE1I%Exif\x00\x00II*\x00\x08\x00\x00\x00\x09\x00\x0F\x01\x02\x00\x06\x00\x00\x00z\x00\x00\x00\x10\x01\x02\x00\x0E\x00\x00\x00\x80\x00\x00\x00\x12\x01\x03\x00\x01\x00\x00\x00\x01\x00\x00\x00\x1A\x01\x05\x00\x01\x00\x00\x00\xA0\x00\x00\x00\x1B\x01\x05\x00\x01\x00\x00\x00\xA8\x00\x00\x00(\x01\x03\x00\x01\x00\x00\x00\x02\x00s32\x01\x02\x00\x14\x00\x00\x00\xB0\x00\x00\x00\x13\x02\x03\x00\x01\x00\x00\x00\x02\x003si\x87\x04\x00\x01\x00\x00\x00\xC4\x00\x00\x00X$\x00\x00Canon\x00Canon EOS 20D\x0033\x7F\xFF\xF5\xBB3333\xB7\xF7\xBF;\xB3;33H\x00\x00\x00\x01\x00\x00\x00H\x00\x00\x00\x01\x00\x00\x002018:05:06 18:33:31\x00\x1C\x00\x9A\x82\x05\x00\x01\x00\x00\x00\x1A\x02\x00\x00\x9D\x82\x05\x00\x01\x00\x00\x00\x22\x02\x00\x00\x22\x88\x03\x00\x01\x00\x00\x00\x02\x0073'\x88\x03\x00\x01\x00\x00\x00@\x06\xCC\xCC\x00\x90\x07\x00\x04\x00\x00\x000221\x03\x90\x02\x00\x14\x00\x00\x00*\x02\x00\x00\x04\x90\x02\x00\x14\x00\x00\x00>\x02\x00\x00\x01\x91\x07\x00\x04\x00\x00\x00\x01\x02\x03\x00\x01\x92" 400 182 "-" "-"
所以乍一看,我会说这是图像的二进制数据,以某种方式最终出现在请求中 URL?怎么会这样?
好的,在将设置转换为 Apache/mod_php 后,我注意到这台机器上没有安装 GD 扩展(在日志中得到一个 Call to undefined method imagecreatefromjepg
)。我安装了 GD,现在它可以正常工作了。不知道为什么 php-fpm
吞下了错误并在 nginx 中产生了这种奇怪的行为