2013-04-12 3 views
0

Я загружаю электронную таблицу Google Диска через API в PHP. Запрос возвращает таблицу XLSX, и мне нужно разархивировать ее. Чтобы сохранить ответ на временный, а затем вызов, скажем, zip_open(), есть способ, которым я могу просто передать такой метод в строку?PHP unzip string

ответ

2

Я думаю, что ваш лучший вариант - создать временный файл, а затем распаковать его.

// Create a temporary file which creates file with unique file name 
$tmp = tempnam(sys_get_temp_dir(), md5(uniqid(microtime(true)))); 

// Write the zipped content inside 
file_put_contents($tmp, $zippedContent); 

// Uncompress and read the ZIP archive 
$zip = new ZipArchive; 
if (true === $zip->open($tmp)) { 
    // Do whatever you want with the archive... 
    // such as $zip->extractTo($dir); $zip->close(); 
} 

// Delete the temporary file 
unlink($tmp); 
+0

Позор, он не может читать поток, ну, это работает :) –

1

Я написал бы временный файл сам, но вы можете увидеть первый комментарий здесь: http://de3.php.net/manual/en/ref.zip.php


wdtemp на Seznam точка CZ Привет, если у вас есть необработанного из ZIP ФАЙЛ В ТОЛЬКО СТРОКИ, и вы не можете создавать файлы на своем сервере (из-за SAFE MODE), чтобы иметь возможность создать файл, который вы можете передать в zip_open(), вам будет трудно получить несжатое содержимое ваших данных ZIP. Это может помочь: я написал простую функцию декомпрессии ZIP для распаковки первого файла из архива, хранящегося в строке (независимо от того, какой файл он). Это как раз о разборе локального заголовка файла первого файла, получение необработанных сжатых данных этого файла и декомпрессии этих данных (как правило, данные в ZIP-файлах сжимаются методом «DEFLATE», поэтому мы будем просто распаковать это функция gzinflate() тогда).

<?php 
function decompress_first_file_from_zip($ZIPContentStr){ 
//Input: ZIP archive - content of entire ZIP archive as a string 
//Output: decompressed content of the first file packed in the ZIP archive 
    //let's parse the ZIP archive 
    //(see 'http://en.wikipedia.org/wiki/ZIP_%28file_format%29' for details) 
    //parse 'local file header' for the first file entry in the ZIP archive 
    if(strlen($ZIPContentStr)<102){ 
     //any ZIP file smaller than 102 bytes is invalid 
     printf("error: input data too short<br />\n"); 
     return ''; 
    } 
    $CompressedSize=binstrtonum(substr($ZIPContentStr,18,4)); 
    $UncompressedSize=binstrtonum(substr($ZIPContentStr,22,4)); 
    $FileNameLen=binstrtonum(substr($ZIPContentStr,26,2)); 
    $ExtraFieldLen=binstrtonum(substr($ZIPContentStr,28,2)); 
    $Offs=30+$FileNameLen+$ExtraFieldLen; 
    $ZIPData=substr($ZIPContentStr,$Offs,$CompressedSize); 
    $Data=gzinflate($ZIPData); 
    if(strlen($Data)!=$UncompressedSize){ 
     printf("error: uncompressed data have wrong size<br />\n"); 
     return ''; 
    } 
    else return $Data; 
} 

function binstrtonum($Str){ 
//Returns a number represented in a raw binary data passed as string. 
//This is useful for example when reading integers from a file, 
// when we have the content of the file in a string only. 
//Examples: 
// chr(0xFF) will result as 255 
// chr(0xFF).chr(0xFF).chr(0x00).chr(0x00) will result as 65535 
// chr(0xFF).chr(0xFF).chr(0xFF).chr(0x00) will result as 16777215 
    $Num=0; 
    for($TC1=strlen($Str)-1;$TC1>=0;$TC1--){ //go from most significant byte 
     $Num<<=8; //shift to left by one byte (8 bits) 
     $Num|=ord($Str[$TC1]); //add new byte 
    } 
    return $Num; 
} 
?> 
0

Посмотрите функции ZLIB (если таковые имеются в вашей системе). Насколько я знаю, есть что-то вроде zlib-decode (или так), которое может обрабатывать необработанные данные zip.