gpt4 book ai didi

php - 尝试从 azure blob 下载文件,mime 类型有问题

转载 作者:行者123 更新时间:2023-12-02 06:33:05 28 4
gpt4 key购买 nike

我有以下代码,按下按钮时通过 ajax 调用下载文件。奇怪的是它实际上工作正常,给了我预期的文件一段时间,当我重新访问以更改一些命名约定时,mime 类型给我带来了问题。下载时,它告诉我资源被解释为文档,但通过 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());

}

最佳答案

您可以使用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-type 的示例:

<?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 存储的最佳做法始终是为 blob 设置内容类型,然后您可以使用上面提供的代码以正确的 mime 类型从 Azure 存储下载文件。

下面的代码示例展示了如何将 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 />";
}

关于php - 尝试从 azure blob 下载文件,mime 类型有问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41704063/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com