Тест Apache multipart/form-data

Я столкнулся со странной проблемой с файлом Apache.

Мне нужно подчеркнуть функцию, которая обрабатывает загрузку файлов. Итак, я погуглил и нашел пост, описывающий, как правильно создать файл поста. Его содержимое выглядит так:

--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--

Линия ab такая:

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

Когда 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

Ожидаемый возврат - повышение params.inspect, которое позволяет мне увидеть, поступают ли данные на другую сторону. Если я удаляю границу, я вижу данные, полученные в параметрах, но это не то, что я хочу. Я хочу получить файл загрузки.

У кого-нибудь есть совет? Я действительно ценю это.

1 ответ

Я нашел ответ и решил поделиться с вами.

После некоторой борьбы с файлом post, я решил создать php-скрипт, чтобы вывести переменные $_FILES и $_REQUEST, чтобы убедиться, что файл собран правильно. Действительно, apache получает файл отлично, и я мог видеть данные файла и другие параметры запроса.

С Rails такого не происходит, и после прочтения документации по разделу HTTP 1.1, я понимаю, что проблема была связана с форматом файла поста.

Когда вы строите этот тип файла, вам нужно его детально построить, и это означает, что все специальные символы, такие как \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

Когда вы открываете этот файл, вы видите это на самом деле:

--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--

Я надеюсь, что это поможет вам.

Приветствия.

Другие вопросы по тегам