我正在使用ApacheBench来对PHP图像上传模块进行基准测试。事情是,当我转储$_FILES["my_file"]
时,我可以看到PHP存储的临时文件不是图像文件,它是一个base64(text / plain)文件。鉴于POST
请求告诉上传文件的内容类型为image/jpeg
,PHP不应该将该文件存储为图像文件吗?或者PHP是否按预期运行,我的工作是处理$_FILES["my_file"]["tmp_name"]
内的二进制数据?
以下是我如何运行ab:
$>ab -v 4 -n 10 -c 2 -p /home/post_data.txt -T "multipart/form-data;\
boundary=1234567890" http://localhost/image_upload
这是/home/post_data.txt的内容:
--1234567890
Content-Disposition: form-data; name="token"
Content-Type: text/plain
1
--1234567890
Content-Disposition: form-data; name="text"
Content-Type: text/plain
Testing
--1234567890
Content-Disposition: form-data; name="status"
Content-Type: text/plain
1
--1234567890
Content-Disposition: form-data; name="uploaded_file"; filename="my_image.jpg"
Content-Type: image/jpeg
Content-Transfer-Encoding: binary
[[base64 image data]]
--1234567890--
[请注意,我尝试删除"Content-Type: text/plain"
,但似乎没有任何区别]
谢谢!
答案 0 :(得分:1)
我终于放弃了这一点:PHP忽略了标题(Content-Transfer-Encoding
),最终我得到了一个包含大量二进制数据而不是图像文件的文本文件。
不是AB的错...
答案 1 :(得分:0)
我设法通过将图像二进制文件直接添加到post_data文件中来执行任务。
cat image.jpeg >> post_data
post_data文件的内容如下所示。
--123456789
Content-Disposition: form-data; name="file"; filename="image.jpg"
Content-Type: image/jpeg
"binary content goes here"
--123456789
并确保您的post_data以CRLF文件结尾而不是LF。
答案 2 :(得分:0)
添加Content-Transfer-Encoding: base64
解决了这个问题。
完整的post-data.txt
文件,结尾为CRLF
:
--1234567890
Content-Disposition: form-data; name="file"; filename="image.jpg"
Content-Transfer-Encoding: base64
Content-Type: image/jpeg
[base64 encoded image here]
--1234567890--
完整命令:
$ ab -c 5 -n 5 -p ./post_data.txt -T "multipart/form-data; boundary=1234567890" http://localhost:8080/upload
在将Flask与imageio.imread(file)
一起使用时遇到此错误,导致错误Could not find a format to read the specified file in mode 'i'