пытается скачать файл с лазурного блоба, проблемы с пантомимой

У меня есть следующий код, который загружает файл через вызов ajax при нажатии кнопки. Что странно, так это то, что он действительно работал правильно, давая мне ожидаемый файл, в течение некоторого времени, и когда я вернулся к изменению некоторых соглашений об именах, тип mime вызывает у меня проблемы. При загрузке он сообщает, что ресурс интерпретируется как Document, но передается с помощью application / octet-stream. Эти файлы могут быть PDF, изображениями или документами Word. Я думаю, что один из способов сделать это — проверить имя на расширение и назначить правильный тип 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 () функции, чтобы получить MIME-тип файла для загрузки.

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

<?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 сначала загрузит весь файл в память.

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

<?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 всегда, указав тип содержимого для большого двоичного объекта, тогда вы можете использовать приведенный выше код для загрузки файла из хранилища Azure с правильным MIME-типом.

В приведенном ниже примере кода показано, как загрузить BLOB-объект в контейнер с 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 />";
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector