2017-01-17 3 views
0

У меня есть следующий код, который загружает файл через вызов ajax при нажатии кнопки. Что странно, это действительно работает правильно, дав мне ожидаемый файл, в течение некоторого времени, и когда я пересматриваю, чтобы изменить некоторые соглашения об именах, тип mime дает мне проблемы. При загрузке он сообщает, что ресурс интерпретируется как Документ, но передается с приложением/октетом-потоком. Эти файлы могут быть документами в формате pdf, изображения или слова. Я предполагаю, что один из способов сделать это - проверить имя для расширения и назначить правильный тип mime, но есть ли еще один общий способ сделать это, или я могу получить исходный файл из октет-поток как-то?пытается загрузить файл из azure blob, проблемы с типом mime

try { 
    // Get blob. 
    $blob = $blobClient->getBlob($container, $blob_name); 
    $properties = $blobClient->getBlobProperties($container, $blob_name); 
    $size = $properties->getProperties()->getContentLength(); 
    $mime = $properties->getProperties()->getContentType(); 

    header("Content-type: $mime"); 
    header("Content-length: $size"); 
    header ("Content-Disposition: attachment; filename=$blob_name"); 
    fpassthru($blob->getContentStream()); 

} 

ответ

1

Вы можете сделать использование finfo() функций, чтобы получить мим-тип файла, который будет загружен.

Вот пример фрагмента кода.

<?php 

try { 
    // Get blob. 
    $blob = $blobClient->getBlob($container, $blob_name); 
    $properties = $blobClient->getBlobProperties($container, $blob_name); 
    $size = $properties->getProperties()->getContentLength(); 

    $content = stream_get_contents($blob->getContentStream()); 
    $finfo = new finfo(FILEINFO_MIME); 
    $mime = $finfo->buffer($content); 

    header("Content-type: $mime"); 
    header("Content-length: $size"); 
    header ("Content-Disposition: inline; filename=$blob_name"); 

    print_r($content); 

} catch(ServiceException $e) { 

    $code = $e->getCode(); 
    $error_message = $e->getMessage(); 
    echo $code.": ".$error_message."<br />"; 
} 

Однако вы также можете получить файл типа mime на основе расширения файла. И это будет более эффективно, чем finfo(), особенно если у вас есть большие файлы для загрузки. Потому что stream_get_contents сначала загрузит весь файл в память.

Вот пример получения мим-типа с расширением файла:

<?php 

try { 
    // Get blob. 
    $blob = $blobClient->getBlob($container, $blob_name); 
    $properties = $blobClient->getBlobProperties($container, $blob_name); 
    $size = $properties->getProperties()->getContentLength(); 

    $value = explode('.', $blob_name); 
    $extension = strtolower(end($value)); 
    $mime = detectByFileExtension($extension); 

    header("Content-type: $mime"); 
    header("Content-length: $size"); 
    header ("Content-Disposition: inline; filename=$blob_name"); 

    fpassthru($blob->getContentStream()); 

} catch(ServiceException $e) { 

    $code = $e->getCode(); 
    $error_message = $e->getMessage(); 
    echo $code.": ".$error_message."<br />"; 
} 

function detectByFileExtension($extension) {  
    $extensionToMimeTypeMap = getExtensionToMimeTypeMap(); 

    if (isset($extensionToMimeTypeMap[$extension])) { 
     return $extensionToMimeTypeMap[$extension]; 
    } 
    return 'text/plain'; 
} 

function getExtensionToMimeTypeMap() { 
    return [ 
     'hqx' => 'application/mac-binhex40', 
     'cpt' => 'application/mac-compactpro', 
     'csv' => 'text/x-comma-separated-values', 
     'bin' => 'application/octet-stream', 
     'dms' => 'application/octet-stream', 
     'lha' => 'application/octet-stream', 
     'lzh' => 'application/octet-stream', 
     'exe' => 'application/octet-stream', 
     'class' => 'application/octet-stream', 
     'psd' => 'application/x-photoshop', 
     'so' => 'application/octet-stream', 
     'sea' => 'application/octet-stream', 
     'dll' => 'application/octet-stream', 
     'oda' => 'application/oda', 
     'pdf' => 'application/pdf', 
     'ai' => 'application/pdf', 
     'eps' => 'application/postscript', 
     'ps' => 'application/postscript', 
     'smi' => 'application/smil', 
     'smil' => 'application/smil', 
     'mif' => 'application/vnd.mif', 
     'xls' => 'application/vnd.ms-excel', 
     'ppt' => 'application/powerpoint', 
     'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 
     'wbxml' => 'application/wbxml', 
     'wmlc' => 'application/wmlc', 
     'dcr' => 'application/x-director', 
     'dir' => 'application/x-director', 
     'dxr' => 'application/x-director', 
     'dvi' => 'application/x-dvi', 
     'gtar' => 'application/x-gtar', 
     'gz' => 'application/x-gzip', 
     'gzip' => 'application/x-gzip', 
     'php' => 'application/x-httpd-php', 
     'php4' => 'application/x-httpd-php', 
     'php3' => 'application/x-httpd-php', 
     'phtml' => 'application/x-httpd-php', 
     'phps' => 'application/x-httpd-php-source', 
     'js' => 'application/javascript', 
     'swf' => 'application/x-shockwave-flash', 
     'sit' => 'application/x-stuffit', 
     'tar' => 'application/x-tar', 
     'tgz' => 'application/x-tar', 
     'z'  => 'application/x-compress', 
     'xhtml' => 'application/xhtml+xml', 
     'xht' => 'application/xhtml+xml', 
     'zip' => 'application/x-zip', 
     'rar' => 'application/x-rar', 
     'mid' => 'audio/midi', 
     'midi' => 'audio/midi', 
     'mpga' => 'audio/mpeg', 
     'mp2' => 'audio/mpeg', 
     'mp3' => 'audio/mpeg', 
     'aif' => 'audio/x-aiff', 
     'aiff' => 'audio/x-aiff', 
     'aifc' => 'audio/x-aiff', 
     'ram' => 'audio/x-pn-realaudio', 
     'rm' => 'audio/x-pn-realaudio', 
     'rpm' => 'audio/x-pn-realaudio-plugin', 
     'ra' => 'audio/x-realaudio', 
     'rv' => 'video/vnd.rn-realvideo', 
     'wav' => 'audio/x-wav', 
     'jpg' => 'image/jpeg', 
     'jpeg' => 'image/jpeg', 
     'jpe' => 'image/jpeg', 
     'png' => 'image/png', 
     'gif' => 'image/gif', 
     'bmp' => 'image/bmp', 
     'tiff' => 'image/tiff', 
     'tif' => 'image/tiff', 
     'svg' => 'image/svg+xml', 
     'css' => 'text/css', 
     'html' => 'text/html', 
     'htm' => 'text/html', 
     'shtml' => 'text/html', 
     'txt' => 'text/plain', 
     'text' => 'text/plain', 
     'log' => 'text/plain', 
     'rtx' => 'text/richtext', 
     'rtf' => 'text/rtf', 
     'xml' => 'application/xml', 
     'xsl' => 'application/xml', 
     'mpeg' => 'video/mpeg', 
     'mpg' => 'video/mpeg', 
     'mpe' => 'video/mpeg', 
     'qt' => 'video/quicktime', 
     'mov' => 'video/quicktime', 
     'avi' => 'video/x-msvideo', 
     'movie' => 'video/x-sgi-movie', 
     'doc' => 'application/msword', 
     'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 
     'dot' => 'application/msword', 
     'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 
     'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 
     'word' => 'application/msword', 
     'xl' => 'application/excel', 
     'eml' => 'message/rfc822', 
     'json' => 'application/json', 
     'pem' => 'application/x-x509-user-cert', 
     'p10' => 'application/x-pkcs10', 
     'p12' => 'application/x-pkcs12', 
     'p7a' => 'application/x-pkcs7-signature', 
     'p7c' => 'application/pkcs7-mime', 
     'p7m' => 'application/pkcs7-mime', 
     'p7r' => 'application/x-pkcs7-certreqresp', 
     'p7s' => 'application/pkcs7-signature', 
     'crt' => 'application/x-x509-ca-cert', 
     'crl' => 'application/pkix-crl', 
     'der' => 'application/x-x509-ca-cert', 
     'kdb' => 'application/octet-stream', 
     'pgp' => 'application/pgp', 
     'gpg' => 'application/gpg-keys', 
     'sst' => 'application/octet-stream', 
     'csr' => 'application/octet-stream', 
     'rsa' => 'application/x-pkcs7', 
     'cer' => 'application/pkix-cert', 
     '3g2' => 'video/3gpp2', 
     '3gp' => 'video/3gp', 
     'mp4' => 'video/mp4', 
     'm4a' => 'audio/x-m4a', 
     'f4v' => 'video/mp4', 
     'webm' => 'video/webm', 
     'aac' => 'audio/x-acc', 
     'm4u' => 'application/vnd.mpegurl', 
     'm3u' => 'text/plain', 
     'xspf' => 'application/xspf+xml', 
     'vlc' => 'application/videolan', 
     'wmv' => 'video/x-ms-wmv', 
     'au' => 'audio/x-au', 
     'ac3' => 'audio/ac3', 
     'flac' => 'audio/x-flac', 
     'ogg' => 'audio/ogg', 
     'kmz' => 'application/vnd.google-earth.kmz', 
     'kml' => 'application/vnd.google-earth.kml+xml', 
     'ics' => 'text/calendar', 
     'zsh' => 'text/x-scriptzsh', 
     '7zip' => 'application/x-7z-compressed', 
     'cdr' => 'application/cdr', 
     'wma' => 'audio/x-ms-wma', 
     'jar' => 'application/java-archive', 
    ]; 
} 

Кроме того, лучшая практика, чтобы загрузить файл в Azure хранения всегда настройки Content-Type для сгустка, то вы может использовать приведенный выше код для загрузки файла из хранилища Azure с соответствующим типом mime.

В примере кода ниже показано, как загрузить двоичный объект в контейнер с Content-Type:

<?php 

require_once 'vendor/autoload.php'; 

use WindowsAzure\Common\ServicesBuilder; 
use MicrosoftAzure\Storage\Blob\Models\CreateBlobOptions; 

$connectionString = "DefaultEndpointsProtocol=https;AccountName=$account;AccountKey=$key"; 

$blobClient = ServicesBuilder::getInstance()->createBlobService($connectionString); 

$filetoUpload = realpath('./image.jpg'); 
$content = fopen($filetoUpload, "r"); 
$mime = mime_content_type($filetoUpload); 
$blob_name = "image.jpg"; 

try { 
    //Upload blob 
    $options = new CreateBlobOptions(); 
    $options->setContentType($mime); 
    $blobClient->createBlockBlob("mycontainer", $blob_name, $content, $options); 
} 
catch(ServiceException $e) { 
    $code = $e->getCode(); 
    $error_message = $e->getMessage(); 
    echo $code.": ".$error_message."<br />"; 
} 
+0

Спасибо, просто добавив тип пантомимы при загрузке решить эту проблему. Очень просто, не подумал бы сделать это в первую очередь по какой-то причине! – nick

Смежные вопросы