2017-01-17 1 views
0

J'ai le code suivant qui télécharge un fichier via un appel ajax lorsque le bouton est enfoncé. Ce qui est bizarre, c'est que ça a bien fonctionné, en me donnant le fichier attendu, pendant un certain temps et quand j'ai revisité pour changer certaines conventions de nommage, le type mime me donne des problèmes. Lors du téléchargement, il me dit que la ressource est interprétée comme document mais transférée avec application/octet-stream. Ces fichiers peuvent être un pdf, une image ou un document Word. Je suppose qu'une façon de le faire serait de vérifier le nom de l'extension et d'assigner le type mime correct, mais y a-t-il un moyen plus général de le faire? octet-stream en quelque sorte?en train de télécharger un fichier à partir d'azur blob, problèmes avec le type 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()); 

} 

Répondre

1

Vous pouvez utiliser les fonctions finfo() pour obtenir mime-type d'un fichier à télécharger.

Voici un exemple de fragment de code. Toutefois, vous pouvez également récupérer le type mime d'un fichier en fonction de l'extension du fichier. Et il sera plus efficace que les fonctions finfo() en particulier lorsque vous avez des fichiers volumineux à télécharger. Car stream_get_contents chargera tout le fichier dans la mémoire en premier.

Voici un exemple d'obtenir le type MIME de l'extension du fichier:

<?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', 
    ]; 
} 

De plus, la meilleure pratique pour télécharger le fichier dans le stockage Azure est mise toujours contenu de type pour le blob, vous pouvez utiliser le code fourni ci-dessus pour télécharger le fichier à partir du stockage Azure avec le type mime approprié.

L'exemple de code ci-dessous montre comment télécharger un blob dans un récipient avec 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

Merci, tout en ajoutant type MIME sur le téléchargement a résolu le problème. Très simple, n'aurait pas pensé à le faire en premier lieu pour une raison quelconque! – nick