2009-10-16 2 views
4

Я хотел бы загрузить файл из html-формы, разместить его на PHP и загрузить его в память, минуя его запись в файл. Можно ли загружать файл и хранить его в памяти, или мне нужно записать его в файл?PHP Загрузка файла в память

+1

Кажется, слишком много энергии требуется для скромного PHP. – Ismael

ответ

2

Я не думаю, что это возможно сейчас. Вы не можете использовать вход php: // с enctype = "multipart/form-data", чтобы исключить открытие файла из потока. Если вы отправляетесь по маршруту почты, вы можете использовать переменную $ _FILE, которая не содержит двоичных данных, а только указатель на файл на диске.

Похоже, что xforms поможет (http://www.ibm.com/developerworks/xml/library/x-xformstipuploadphp/index.html), но это даже в Firefox 3.5. Для этого нужен плагин, который для меня является убийцей сделки.

+0

Ожидаете ли вы, что люди смогут загружать файлы с помощью веб-браузера? Потому что вам может быть трудно найти браузеры, поддерживающие PUT. –

+0

http://stackoverflow.com/questions/165779/are-the-put-delete-head-etc-methods-available-in-most-web-browsers –

+0

Альтернативой является использование серверной реализации XForms (например, с открытым исходным кодом http://www.orbeon.com/). Таким образом, вы можете поддерживать все браузеры, не требуя, чтобы люди устанавливали расширения, и вы можете обрабатывать загрузку так, как вы описываете. Конечно, IMHO это имеет смысл, если вам нужны другие функции от XForms, помимо загрузки файлов. – avernet

0

Поскольку PHP не обрабатывает собственно HTTP-запросы (это работа веб-сервера), я не могу себе представить, что это возможно. Было бы здорово, если бы кто-то мог доказать, что я ошибаюсь.

+0

определенно невозможно с использованием стандартных процедур PHP. – dusoft

+0

У PHP есть параметр «upload_tmp_dir», который контролирует, куда идут загруженные файлы. Таким образом, похоже, что у него есть некоторый контроль. –

+0

Да, это интересно. Я бы предположил, что это просто говорит Apache: «Эй, посадите этих парней сюда!» – Kai

2

Опция PUT прохладная. Если вы хотите использовать POST и $ _FILES, я думаю, что ближе всего вы могли бы указать upload_tmp_dir на ramdisk.

+0

Мне классно, и у кого-нибудь есть полный пример этого? – CLJ

0

Http put легко на PHP.

<?php 
$f = fopen('php://input','r'); 
$content =''; 
while(!feof($f)){ 
    $content .= fread($f,8192); 
} 
?> 

$ content - содержимое файла. Не забудьте сначала настроить веб-сервер для обработки запроса HTTP PUT.

2

я столкнулась с проблемой в последнее время и, наконец, использовать следующее решение: (не уверен, если это на самом деле решить эту проблему, я очень ценю ваше предложение)

на стороне клиента,

отправить заголовок с " 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');

$ данных здесь будет загруженным файлом.


В нашем случае частота загрузки файлов довольно высока. Поэтому лучше уменьшить работу файловой системы.

0

Вы можете указать выгружаемый каталог на tmpfs том, если под Linux, то он будет в памяти, даже если используется интерфейс файловой системы.