Możesz skorzystać z JSZip. Dla wejścia, obsługuje String/ArrayBuffer/Uint8Array/Buffer, ale nieblob
s, co jest, co można uzyskać z <input type="file"/>
z javascript:
Obiekt File jest specyficzny rodzaj Blob, i mogą być używane w dowolnym kontekście, że blob może
(link)
Więc trzeba przekształcić blob/plik do np najpierw ArrayBuffer, np. przy użyciu FileReader.readAsArrayBuffer()
. Zauważ, że ta funkcja działa asynchronicznie, wymagając użycia wywołania zwrotnego. Dostępna jest również wersja FileReaderSync "Ten interfejs jest dostępny tylko dla pracowników, ponieważ umożliwia synchroniczne operacje we/wy, które mogą potencjalnie blokować", więc nie widzę żadnego pożytku z jego używania.
(EDIT. Nie jestem pewien, ale wierzę, że można pominąć blob-> konwersji ArrayBuffer teraz i po prostu zip obiekt File.)
Cała ta jest szczególnie przydatna podejście jeśli dyrektywa PHP max_file_uploads
było zestaw do niewielkiej liczby przez gospodarza Przestrzeń, na razie jedyną rzeczą, którą musisz się martwić o to upload_max_filesize
dla porównania, wielkość próbki kodu następujący fragment (używając JQuery
) za wprowadzenie kilku plików z jednego wejścia multiple
w pliku zip przed przesłaniem:
// onclick:
var fileInput = $(':file');
var files = [];
$.each(fileInput[0].files, function(i, file) {
files.push(file);
});
var zip = new JSZip();
function addFileToZip(n) {
if(n >= files.length) {
zippingComplete(zip.generate({type:"blob", compression:"deflate"}));
return;
}
var file = files[n];
var arrayBuffer;
var fileReader = new FileReader();
fileReader.onload = function() {
arrayBuffer = this.result;
zip.file(file.name, arrayBuffer);
addFileToZip(n + 1);
};
fileReader.readAsArrayBuffer(file);
}
addFileToZip(0);
function zippingComplete(zip) {
formData = new FormData();
formData.append('fileZip', zip);
formData.append("param1", "blah");
$.ajax({
data: formData,
//... etc
Po stronie serwera uzyskasz dostęp do $_FILES["fileZip"]
.
Znalazłem to, ale nigdy go nie używałem (i nie Flash tutaj): http://jszip.stuartk.co.uk/ – AsTheWormTurns
Dzięki za link, ale w zasadzie potrzebowałbym rozwiązania, które działa we wszystkich głównych przeglądarkach takich jak jak IE7 +, FF, Safari i Chrome. – feketegy