Pytanie w sprawie php – Pobieranie plików mime typu zip

3

Pobieranie typu MIME przesłanego pliku jest wystarczająco proste:

<code>echo mime_content_type($fileatt['tmp_name']);
</code>

Jednak chcę też sprawdzić typ mime plików, które są zawarte w spakowanym pliku. Po rozpakowaniu plików (przeglądanie plików w archiwum i gdziei jest aktualnym plikiem), próbowałem:

<code>$info = pathinfo($zip->getNameIndex($i));
echo mime_content_type($info['dirname'] . "\\" . $info['basename']);
</code>

co daje błąd: Ostrzeżenie: mime_content_type () [function.mime-content-type]: Nie znaleziono pliku lub ścieżki '.C:\Users\<user>\<website>\validation.php na linii 56

Zdałem sobie sprawę, żedirname plik spakowany jest względny względem pliku zip, a nie bezwzględnej ścieżki, więc spróbowałem:

<code>$a = pathinfo($fileatt['tmp_name']);
$b = $a['dirname'] . "\\" . $info['basename'];
echo mime_content_type($b);
</code>

co daje błąd: Ostrzeżenie: mime_content_type () [function.mime-content-type]: Nie znaleziono pliku lub ścieżki 'C: xampp mp PHP.pdf' wC:\Users\<user>\<website>\validation.php na linii 56

Czy ktoś może rzucić światło na ścieżkę pliku? (Podejrzewam, że odpowiedź może być taka sama jak komentarzuzyskanie wysokości i szerokości obrazu ze spakowanych plików, ale czy są jakieś alternatywne metody?)

AKTUALIZACJA

Dzięki Babie działa:

<code>$fp = fopen('zip://C:\Users\<user>\<website>\test.zip#foo.jpg', "r");
</code>

(n.b. Mogę to zrobić tylko wtedy, gdy podam pełną trasę pliku zip, a nie plik tmp, tak jak w przypadku przesłania pliku za pomocą formularza). Jednak próbując uzyskać typ MIME:echo mime_content_type($fp); generuje błąd:

<code>Warning: mime_content_type() [function.mime-content-type]: stream does not support seeking in C:\Users\<user>\<website>\includes\validation.php on line 70
</code>

Dzieje się tak niezależnie od typu pliku (tj. Problemu wskazanego w jedynym komentarzuhttp://php.net/manual/en/ziparchive.getstream.php nie ma na mnie wpływu.

Nawiasem mówiąc, jest to również ten sam błąd, który otrzymuję, gdy próbuję innej metody:$fp = $zip->getStream('foo.jpg');

Wiem, że istnieje kilka innych pytań „nie wspieranych strumieniowo” dotyczących SO, ale nie mogłem ustalić, w jaki sposób mają one związek z moim problemem i miałem nadzieję, że ponieważ ta metoda została specjalnie zasugerowana, ktoś może mieć dobrą odpowiedź. .

(s.s. Nie używamfinfo_* działa, ponieważ mój host obecnie nie chce zainstalować PHP v5.3).

Przetestowałeś to za pomocąZip extension's stream wrapper ? Baba
Możesz używać tylkomime_content_type() na plikach fizycznych, co oznacza, że ​​będziesz musiał wyodrębnić pliki zip do katalogu, a następnie przejrzeć je, a nie tylko przechodzić przez listę plików zip. Nadh

Twoja odpowiedź

2   odpowiedź
2

5.3, ale trochę się na tym utknąłem i po prostu to zrozumiałem, mam nadzieję, że będzie użyteczny dla tych z najnowszej wersji - nie mogłem tego zobaczyć napisane gdziekolwiek indziej.

Po prostu możesz użyćfinfo-> bufor na danych binarnych, aby wyodrębnić typ MIME, który jest dostępny bez wyodrębniania zawartości do nowego pliku.

<code>$zip = new ZipArchive;
$zip->open("dir/archive.zip");
$binary = $zip->getFromIndex($fileToUnzip);
$filename = $zip->getNameIndex($fileToUnzip);
$zip->close();

$finfo = new finfo(FILEINFO_MIME_TYPE);
$MIMETypeandCharset = $finfo->buffer($binary);

// discard charset info
$MIMETypeAndCharsetArray = explode(';', $MIMETypeAndCharset);
$MIMEtype = $MIMETypeAndCharsetArray[0];


// you can change the source of an iframe to this php file in order to view a preview
// If the browser can't handle the file, the user is presented with a download box

header('Content-Type:$MIMEtype');
header('Content-Disposition: inline; filename="July Report.pdf"')
echo $binary;
</code>
2

O. Możesz zacząć od wypróbowania

<code> mime_content_type('zip:///path/to/file.zip#'. $chapterZip->getNameIndex ( $i ));
</code>

B. To, o czym teraz mogę tylko myśleć, to zastąpieniemime_content_type to może nie być najlepsze podejście, ale jestem pewien, że będzie to widoczne, dopóki nie wymyślę lepszego rozwiązania

<code>$chapterZip = new ZipArchive ();
if ($chapterZip->open ( "stockoverflow.zip" )) {
    for($i = 0; $i < $chapterZip->numFiles; $i ++) {
        var_dump ( mime_content_type_replacement ( $chapterZip->getNameIndex ( $i ) ) );
    }
}
</code>

Funkcja wymiany przy użyciufile extension ifinfo_open ( FILEINFO_MIME )

<code>function mime_content_type_replacement($filename) {

    $mime_types = array (

            'txt' => 'text/plain',
            'htm' => 'text/html',
            'html' => 'text/html',
            'php' => 'text/html',
            'css' => 'text/css',
            'js' => 'application/javascript',
            'json' => 'application/json',
            'xml' => 'application/xml',
            'swf' => 'application/x-shockwave-flash',
            'flv' => 'video/x-flv',

            // images
            'png' => 'image/png',
            'jpe' => 'image/jpeg',
            'jpeg' => 'image/jpeg',
            'jpg' => 'image/jpeg',
            'gif' => 'image/gif',
            'bmp' => 'image/bmp',
            'ico' => 'image/vnd.microsoft.icon',
            'tiff' => 'image/tiff',
            'tif' => 'image/tiff',
            'svg' => 'image/svg+xml',
            'svgz' => 'image/svg+xml',

            // archives
            'zip' => 'application/zip',
            'rar' => 'application/x-rar-compressed',
            'exe' => 'application/x-msdownload',
            'msi' => 'application/x-msdownload',
            'cab' => 'application/vnd.ms-cab-compressed',

            // audio/video
            'mp3' => 'audio/mpeg',
            'qt' => 'video/quicktime',
            'mov' => 'video/quicktime',

            // adobe
            'pdf' => 'application/pdf',
            'psd' => 'image/vnd.adobe.photoshop',
            'ai' => 'application/postscript',
            'eps' => 'application/postscript',
            'ps' => 'application/postscript',

            // ms office
            'doc' => 'application/msword',
            'rtf' => 'application/rtf',
            'xls' => 'application/vnd.ms-excel',
            'ppt' => 'application/vnd.ms-powerpoint',

            // open office
            'odt' => 'application/vnd.oasis.opendocument.text',
            'ods' => 'application/vnd.oasis.opendocument.spreadsheet' 
    );

    $ext = pathinfo ( $filename, PATHINFO_EXTENSION );
    if (array_key_exists ( $ext, $mime_types )) {
        return $mime_types [$ext];
    } elseif (function_exists ( 'finfo_open' )) {
        $finfo = finfo_open ( FILEINFO_MIME );
        $mimetype = finfo_file ( $finfo, $filename );
        finfo_close ( $finfo );
        return $mimetype;
    } else {
        return 'application/octet-stream';
    }
}
</code>

Więcej typów mimów

Typy PHP / Mime - lista typów MIME publicznie dostępnych?

http://snipplr.com/view/1937/

Edytuj 1

Właśnie przetestowałem i działa

<code>$fp = fopen('zip://C:\stockoverflow.zip#1.MOV.xml',"r");
</code>

Edytuj 2

ZA.mime_content_type($fp) nie działa, ponieważmime_content_type akceptuj tylko argumenty łańcuchowe patrzhttp://php.net/manual/en/function.mime-content-type.php

B. Nie jestem pewien, dlaczego nadal się trzymaszmime_content_type ponieważ również został zdeprecjonowany

Ta funkcja jest przestarzała, ponieważ rozszerzenie PECL Fileinfo zapewnia tę samą funkcjonalność (i więcej) w znacznie czystszy sposób.

C. pracuje nad$fileatt['tmp_name'] bezpośrednio nie jest idealny .. jest to plik tymczasowy i nie można go manipulować .. abyś mógł pracować nad tym plikiem musisz go skopiować na serwer, na którym PHP miałby pełne uprawnienia dostępu do niego

RE.ZipArchive::getStream działa tylko na lokalnej kopii plikuzip plik nie jest tymczasowym plikiem do pobrania

Myślę, że ogólna odpowiedź jest taka, że ​​nie można zrobić tego, co chcę, bez zapisywania pierwszego zipu. Rozszerzenia PECL są zawarte tylko w PHP 5.3+ (którego mój host nie instaluje - najwyraźniej łamie zbyt wiele rzeczy ...). Jeślifinfo_* metody są amortyzowane, co powinienem zamiast tego używać? ChrisW
dziękuję za dotychczasowe pomocne komentarze; W moim pytaniu zamieściłem trochę więcej informacji - jeśli masz jakieś dodatkowe sugestie, chętnie je wypróbuję :) ChrisW
Dzieki za sugestie. Nie jestem pewien, co jest nie tak: mam$fp = fopen('zip:\\\\\\'.$a['dirname'].'\\test.zip#file.pdf', 'r'); (odwrotne ukośniki z powodu systemu Windows i wszystkie one muszą zostać usunięte - zakładam, że jest to poprawne?),$a jest taki sam, jak zdefiniowano w moim pytaniu; ale mam błąd:Warning: fopen(zip:\\\C:\xampp\tmp\test.zip#file.pdf) [function.fopen]: failed to open stream: Invalid argument in C:\Users\<user>\<website>\includes\validation.php on line 60 ChrisW
Odpowiedz na moją odpowiedź Baba
$fp = fopen('zip://C:\stockoverflow.zip#1.MOV.xml',"r"); Prace Baba

Powiązane pytania