Apache 基准测试 multipart/form-data

rob*_*woc 1 performance benchmarking ruby-on-rails apachebench

我正面临 ap​​ache 基准测试文件的一个奇怪问题。

我需要强调一个处理文件上传的功能。所以,我用谷歌搜索,找到了一篇描述如何正确构建帖子文件的帖子。其内容如下:

--1234567
Content-Disposition: form-data; name="user_id"

3
--1234567
Content-Disposition: form-data; name="file"; filename="cf_login.png"
Content-Type: image/png

[base64 encoded file content]
--1234567--
Run Code Online (Sandbox Code Playgroud)

ab 线是这样的:

$ ab -c 1 -n 5 -v 4 -T 'multipart/form-data; boundary=1234567' -p post_file.txt http://localhost:3000/files
Run Code Online (Sandbox Code Playgroud)

当 ab 发出请求时,生成的标头如下:

INFO: POST header == 
---
POST /files.json/ HTTP/1.0
Content-length: 229
Content-type: multipart/form-data; boundary=simpleboundary
Host: localhost:3000
User-Agent: ApacheBench/2.3
Accept: */*


---
LOG: header received:
HTTP/1.1 500 Internal Server Error 
Content-Type: text/html; charset=utf-8
Content-Length: 13265
X-Request-Id: 9ad57d19cd71886a1bb817d00fac651b
X-Runtime: 0.015504
Server: WEBrick/1.3.1 (Ruby/1.9.3/2012-04-20)
Date: Tue, 25 Sep 2012 13:54:29 GMT
Connection: close
Run Code Online (Sandbox Code Playgroud)

预期的回报是一个 raise params.inspect,它让我看看数据是否到达了另一边。如果我删除边界,我可以看到在 params 中收到的数据,但这不是我想要的。我想上传文件。

有人有提示吗?我会很感激的。

rob*_*woc 8

我找到了答案,并决定与您分享。

在对 post 文件进行了一些努力之后,我决定创建一个 php 脚本来输出 $_FILES 和 $_REQUEST 变量以查看文件是否正确构建。事实上,apache 完美地接收了文件,我可以看到文件数据和其他请求参数。

使用 Rails 不会发生同样的情况,在阅读了 HTTP 1.1 multipart 主题的文档后,我意识到问题与 post 文件格式有关。

当您构建此类文件时,您需要对其进行详细构建,这意味着在正确的位置包含所有特殊字符,如 \r 和 \n。在现在多不为“\ n”的工作的话,那需要“DOS”行结束“\ r \ n”。

所以正确的帖子文件看起来像这样(\r\n 是为了说明,但应该在那里,你知道吗?):

--boundary_hash\r\n
Content-Disposition: form-data; name="your_form_field";\r\n
Content-Type: text/plain\r\n
\r\n
your form field data\r\n
--boundary_hash\r\n
Content-Disposition: form-data; name="another_field";\r\n
Content-Type: text/plain\r\n
\r\n
another field data\r\n
--boundary_hash\r\n
Content-Disposition: form-data; name="filename"; filename="cf_login.png"\r\n
Content-Type: image/png\r\n
\r\n
base64 file content\r\n
--boundary_hash--\r\n
Run Code Online (Sandbox Code Playgroud)

当您打开此文件时,您实际上会看到:

--boundary_hash
Content-Disposition: form-data; name="your_form_field";
Content-Type: text/plain

your form field data
--boundary_hash
Content-Disposition: form-data; name="another_field";
Content-Type: text/plain

another field data
--boundary_hash
Content-Disposition: form-data; name="filename"; filename="cf_login.png"
Content-Type: image/png

base64 file content
--boundary_hash--
Run Code Online (Sandbox Code Playgroud)

我希望这对你有帮助。

干杯。