ab (ApacheBench) загрузка изображения и PHP $_FILES — временный файл, сохраненный как текст base64

Я использую ApacheBench для тестирования модуля загрузки изображений PHP. Дело в том, что когда я выгружаю $_FILES["my_file"], я вижу, что временный файл, хранящийся в PHP, не является файлом изображения, это файл base64 (текстовый/обычный). Разве PHP не должен хранить этот файл как файл изображения, учитывая, что запрос POST сообщает ему, что тип содержимого загруженного файла — image/jpeg? Или PHP ведет себя так, как ожидалось, и моя работа заключается в обработке двоичных данных внутри $_FILES["my_file"]["tmp_name"]?

Вот как я бегаю:

$>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", но, похоже, это не имеет значения]

Спасибо!


person noobeana    schedule 27.08.2013    source источник
comment
Попробуйте решить проблему одним из следующих двух способов: 1. Используйте Content-Transfer-Encoding: base64 вместо Content-Transfer-Encoding: binary 2. Обновите [[data base64 image data]] с помощью [[binary iamge data]]. Вы можете использовать такие инструменты, как WinHex/UltraEdit, для записи двоичных данных.   -  person Rachel    schedule 28.08.2013
comment
Спасибо за ответ, @Rachel! Я попробовал оба предложения без успеха. Очевидно PHP игнорирует заголовок (Content-Transfer-Encoding) из мой запрос. О, и проверьте также это!   -  person noobeana    schedule 29.08.2013
comment
Лол, этот восходит к 2004 году...   -  person noobeana    schedule 30.08.2013


Ответы (3)


Я, наконец, отказался от этого: PHP игнорирует заголовок (Content-Transfer-Encoding), и я получаю текстовый файл, содержащий огромную строку двоичных данных вместо файла изображения.

АБ не виноват...

person noobeana    schedule 01.11.2013

Мне удалось выполнить задачу, добавив двоичный файл изображения непосредственно в файл 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.

person Duy Luong    schedule 12.04.2019

Короткий ответ:

Добавление 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'

person Elijas Dapšauskas    schedule 19.12.2019