Je rencontre actuellement un problème avec le stockage de fichiers Azure lorsque je crée une URL avec un jeton de signature d'accès partagé (SAS) . Le fichier sera téléchargé dans le navigateur, mais le type de contenu est toujours le flux d'application/octet plutôt que de changer pour correspondre au type MIME du fichier. Si je place le fichier dans le stockage Azure BLOB et que je crée une URL avec un jeton SAS, il envoie le type de contenu correct pour mon fichier (image/jpeg).
J'ai mis à niveau mon compte de stockage de V1 à V2 en pensant que c'était le problème, mais cela ne l'a pas résolu.
Quelqu'un a-t-il une idée de ce que je pourrais essayer qui pourrait obtenir le stockage de fichiers Azure pour retourner le type de contenu correct en utilisant une URL avec SAS Token pour télécharger le fichier?
Azure blob tombe à la valeur par défaut de 'application/octet-stream' si rien n'est fourni. Pour obtenir les bons mimetypes, voici ce que j'ai fait avec mon application flask:
@app.route('/', methods=['GET', 'POST'])
def upload_file():
if request.method == 'POST':
f = request.files['file']
mime_type = f.content_type
print (mime_type)
print (type(f))
try:
blob_service.create_blob_from_stream(container, f.filename, f,
content_settings=ContentSettings(content_type=mime_type))
except Exception as e:
print (str(e))
pass
mime_type a été transmis à ContentSettings pour obtenir les mimetypes actuels de fichiers téléchargés sur Azure blob.
Dans nodeJS:
blobService.createBlockBlobFromStream(container, blob, stream, streamLength, { contentSettings: { contentType: fileMimeType } }, callback)
où:
fileMimeType
est le type du fichier en cours de téléchargement
callback
est votre implémentation de rappel
Référence à la méthode utilisée: https://docs.Microsoft.com/en-us/javascript/api/Azure-storage/azurestorage.services.blob.blobservice.blobservice?view=Azure-node-latest#createblockblobfromstream -string - string - stream-readable - number - createblockblobrequestoptions - errororresult-blobresult -
Lorsque je télécharge un fichier jpeg sur un partage de fichiers via le portail, le type de contenu est modifié en application/octet-stream
En effet. Mais je ne peux pas reproduire votre problème de téléchargement.
Je n'ai pas spécifié de type de contenu dans mon SAS demande uri, mais le fichier vient d'être téléchargé en tant que fichier jpeg. J'ai testé dans le SDK (Compte SAS/Politique d'accès stocké/SAS sur le fichier lui-même) ou REST API, les deux fonctionnent même sans type de contenu.
Vous pouvez essayer de spécifier le type de contenu à l'aide du code ci-dessous.
SharedAccessFileHeaders header = new SharedAccessFileHeaders()
{
ContentDisposition = "attachment",
ContentType = "image/jpeg"
};
string sasToken = file.GetSharedAccessSignature(sharedPolicy,header);
Jusqu'à présent, ce sont les seuls correctifs pour le type de contenu que j'ai trouvés:
Pour moi, aucun de ces choix n'est acceptable. Les deux premiers peuvent entraîner des erreurs sur la route si un utilisateur télécharge un fichier via le portail ou Microsoft Azure Storage Explorer et oublie de changer le type de contenu. Je ne veux pas non plus écrire des fonctions Azure ou des travaux Web pour surveiller et résoudre ce problème.
Étant donné que le stockage d'objets blob n'a PAS les mêmes problèmes lors du téléchargement via Microsoft Azure Storage Explore ou via le portail, le coût est beaucoup plus faible ET les deux fonctionnent avec SAS Tokens, nous allons plutôt vers le stockage d'objets blob. Nous perdons la possibilité de monter le lecteur sur nos ordinateurs locaux et d'utiliser quelque chose comme Beyond Compare pour faire des comparaisons de fichiers, mais c'est un inconvénient avec lequel nous pouvons vivre.
Si quelqu'un a une meilleure solution que celles mentionnées ci-dessus qui résout ce problème, je le voterai avec plaisir. Cependant, je pense que Microsoft devra apporter des modifications pour que ce problème soit résolu.
// here you define your file content type
CloudBlockBlob cloudBlockBlob = container.GetBlockBlobReference(file.FileName);
cloudBlockBlob.Properties.ContentType = file.ContentType; //content type