2013-05-18 39 views
8

Dlatego chcę, aby użytkownicy mogli przesyłać duże pliki bez obawy o wartości maksymalnego rozmiaru wiadomości. Alternatywą jest użycie PUT i wysłanie pliku jako nieprzetworzonych danych. Przy użyciu jQuery mogę to zrobić:Granice formularzy i pisanie php: // dane wejściowe do pliku w php

var data = new FormData(); 
    jQuery.each($('#file_upload')[0].files, function(i, file) { 
    data.append('file-'+i, file); 
}); 
$.ajax({ 
    url: 'upload.php?filename=test.pdf', 
    data: data, 
    cache: false, 
    contentType: false, 
    processData: false, 
    type: 'PUT', 
}); 

W PHP mogę to zrobić:

$f = fopen($_GET['filename'], "w"); 
$s = fopen("php://input", "r"); 

while($kb = fread($s, 1024)) 
{ 
    fwrite($f, $kb, 1024); 
} 
fclose($f); 
fclose($s); 
Header("HTTP/1.1 201 Created"); 

nie robię:

$client_data = file_get_contents("php://input"); 

Ponieważ oddanie całego pliku do zmiennej z pewnością zapełni całą pamięć podczas przesyłania ogromnych plików.

Nie mogę zrozumieć, jak zapisać dane pliku bez granic formularza. Teraz pisze się w górnej części pliku na coś takiego:

------WebKitFormBoundaryVz0ZGHLGxBOCUVQG 
Content-Disposition: form-data; name="file-0"; filename="somename.pdf" 
Content-Type: application/pdf 

i na dole coś takiego:

------WebKitFormBoundaryVz0ZGHLGxBOCUVQG--  

Więc muszę analizować dane. Ale do tego muszę przeczytać cały strumień danych w pamięci i przy dużych plikach wideo nie chcę tego robić. Czytałem coś o tworzeniu strumienia php: // temp. Ale bez powodzenia. Jak mogę zapisać zawartość do pliku bez nagłówka granicy? I bez uprzedniego pompowania wszystkich danych do zmiennej?

+0

Czy możesz podać nagłówek 'Content-Type'? –

Odpowiedz

1

Może kombinacja fgets przestać czytać w nowej linii i sprawdzanie granic:

while($kb = fgets($s, 1024)) 
{ 
    if(strpos($kb, '------') === false) //or !== 0 for first position 
    { 
     fwrite($f, $kb, 1024); 
    } 
} 
+0

Ale jak się upewnić, że "-----" jest zawarte w tym samym kawałku? Co jeśli "---" jest zawarte na końcu pierwszej części i "---" - to początek drugiego? Czy nie może tak być? – Tamara

+0

'fgets' odczytuje koniec linii' \ n', więc - będzie na początku następnego wiersza. – AbraCadaver

+0

Jeśli tak jest, co stanie się z następującymi nagłówkami? Zniszczą również plik. –

1

Można użyć this (istnieje wiele podoba). Obsługuje przesyłanie z fragmentami, co oznacza, że ​​nie trafisz żadnych maksymalnych rozmiarów post/file, o ile każda porcja przesyłania jest mniejsza niż maksymalny rozmiar wiadomości.

Obejmuje również PHP code, którego potrzebujesz po stronie serwera.

+0

Używam tego programu do przesyłania blueimp na kilku stronach, które miały dużo przesłanych plików i działało dobrze dla moich użytkowników. –

0

Nie trzeba odtwarzać koła. Po prostu użyj POST i zmień konfigurację PHP na większe limity. Limity te można również ustawić na podstawie katalogu/hosta.

Korzystanie .htaccess lub swoją apache.conf

php_value upload_max_filesize 10G 
php_value post_max_size 10G 

Jest to również dobry pomysł, aby dostosować inne granice, jak max_input_time.

Nie zapomnij o przeniesieniu odebranego pliku za pomocą move_uploaded_file, aby uniknąć dodatkowej pracy.