Я хотел бы загрузить файл из html-формы, разместить его на PHP и загрузить его в память, минуя его запись в файл. Можно ли загружать файл и хранить его в памяти, или мне нужно записать его в файл?PHP Загрузка файла в память
ответ
Я не думаю, что это возможно сейчас. Вы не можете использовать вход php: // с enctype = "multipart/form-data", чтобы исключить открытие файла из потока. Если вы отправляетесь по маршруту почты, вы можете использовать переменную $ _FILE, которая не содержит двоичных данных, а только указатель на файл на диске.
Похоже, что xforms поможет (http://www.ibm.com/developerworks/xml/library/x-xformstipuploadphp/index.html), но это даже в Firefox 3.5. Для этого нужен плагин, который для меня является убийцей сделки.
Ожидаете ли вы, что люди смогут загружать файлы с помощью веб-браузера? Потому что вам может быть трудно найти браузеры, поддерживающие PUT. –
http://stackoverflow.com/questions/165779/are-the-put-delete-head-etc-methods-available-in-most-web-browsers –
Альтернативой является использование серверной реализации XForms (например, с открытым исходным кодом http://www.orbeon.com/). Таким образом, вы можете поддерживать все браузеры, не требуя, чтобы люди устанавливали расширения, и вы можете обрабатывать загрузку так, как вы описываете. Конечно, IMHO это имеет смысл, если вам нужны другие функции от XForms, помимо загрузки файлов. – avernet
Поскольку PHP не обрабатывает собственно HTTP-запросы (это работа веб-сервера), я не могу себе представить, что это возможно. Было бы здорово, если бы кто-то мог доказать, что я ошибаюсь.
определенно невозможно с использованием стандартных процедур PHP. – dusoft
У PHP есть параметр «upload_tmp_dir», который контролирует, куда идут загруженные файлы. Таким образом, похоже, что у него есть некоторый контроль. –
Да, это интересно. Я бы предположил, что это просто говорит Apache: «Эй, посадите этих парней сюда!» – Kai
Опция PUT прохладная. Если вы хотите использовать POST и $ _FILES, я думаю, что ближе всего вы могли бы указать upload_tmp_dir
на ramdisk.
Мне классно, и у кого-нибудь есть полный пример этого? – CLJ
Http put легко на PHP.
<?php
$f = fopen('php://input','r');
$content ='';
while(!feof($f)){
$content .= fread($f,8192);
}
?>
$ content - содержимое файла. Не забудьте сначала настроить веб-сервер для обработки запроса HTTP PUT.
я столкнулась с проблемой в последнее время и, наконец, использовать следующее решение: (не уверен, если это на самом деле решить эту проблему, я очень ценю ваше предложение)
на стороне клиента,
отправить заголовок с " Content-Type: application/octet-stream; " вместо «multipart/form-data»
поэтому файл загрузки не будет сохранен в temp dir на сервере.
Принять ИОС Objective-C код, например:
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:@"your server address"]];
[request setTimeoutInterval:30];
[request setHTTPMethod:@"POST"];
// set Content-Type in HTTP header
NSString *contentType = [NSString stringWithFormat:@"application/octet-stream;"];
[request setValue:contentType forHTTPHeaderField: @"Content-Type"];
// post body
NSMutableData *body = [NSMutableData data];
//yourData is typed NSData here
[body appendData:yourData];
// setting the body of the post to the reqeust
[request setHTTPBody:body];
// set the content-length
NSString *postLength = [NSString stringWithFormat:@"%d", [body length]];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id result) {
success(result);
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id result){
failure(error, result);
}];
[operation start];
на стороне сервера,
использование "PHP: // ввод" для извлечения файла в качестве исходных данных (обратите внимание, что PHP: // вход не будет работать на "многочастные/форме-данных")
, например: $data = file_get_contents('php://input');
$ данных здесь будет загруженным файлом.
В нашем случае частота загрузки файлов довольно высока. Поэтому лучше уменьшить работу файловой системы.
Вы можете указать выгружаемый каталог на tmpfs том, если под Linux, то он будет в памяти, даже если используется интерфейс файловой системы.
Кажется, слишком много энергии требуется для скромного PHP. – Ismael