web-dev-qa-db-fra.com

Le type de contenu de stockage de fichiers Azure est toujours un flux d'application / octet

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?

8
David Yates

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 -

3
abhinav singh

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);
3
Jerry Liu

Jusqu'à présent, ce sont les seuls correctifs pour le type de contenu que j'ai trouvés:

  1. Utilisez l'explorateur de stockage Microsoft Azure pour modifier manuellement la chaîne de type de contenu. Vous devez cliquer avec le bouton droit sur le fichier et les propriétés du clic gauche pour faire apparaître la boîte de dialogue.
  2. Modifiez par programme le fichier à l'aide du package WindowsAzure.Storage Nuget de Microsoft.
  3. Téléchargement de fichiers Surface via mon propre site Web et interdiction d'accès direct.

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.

1
David Yates
// here you define your file content type
CloudBlockBlob cloudBlockBlob = container.GetBlockBlobReference(file.FileName);
                cloudBlockBlob.Properties.ContentType = file.ContentType; //content type
0
Naqi Hussain