web-dev-qa-db-ja.com

Azureファイルストレージのコンテンツタイプは常にapplication / octet-streamです

共有アクセス署名(SAS)トークン を使用してURLを作成すると、Azureファイルストレージに問題が発生します。ファイルはブラウザにダウンロードされますが、コンテンツタイプは、ファイルのMIMEタイプに一致するように変更されるのではなく、常にapplication/octet-streamです。ファイルをAzure BLOBストレージに配置し、SASトークンを使用してURLを作成すると、ファイル(image/jpeg)の正しいコンテンツタイプが送信されます。

ストレージアカウントをV1からV2にアップグレードしましたが、それが問題だと考えましたが、修正されませんでした。

SAS Token with the file to download the fileを使用して、Azure Fileストレージが正しいコンテンツタイプを返すようにするために、私が試すことができる手がかりはありますか?

8
David Yates

何も指定されていない場合、Azure blobはデフォルトの「application/octet-stream」に落ちます。正しいMIMEタイプを取得するために、これは私がflask appで行ったものです。

_@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がContentSettingsに渡され、Azure BLOBにアップロードされたファイルの現在のMIMEタイプが取得されました。

nodeJS:

blobService.createBlockBlobFromStream(container, blob, stream, streamLength, { contentSettings: { contentType: fileMimeType } }, callback)

どこ:

fileMimeTypeは、アップロードされるファイルのタイプです

callbackは、コールバックの実装です

使用されるメソッドへの参照: 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

ポータルからファイル共有にjpegファイルをアップロードすると、content-typeが実際にapplication/octet-streamに変更されます。ダウンロードの問題を再現できません。

SAS request uriでcontent-typeを指定しませんでしたが、ファイルはjpegファイルとしてダウンロードされます。SDK(アカウントSAS/Stored Access Policy/SASファイル自体)でテスト済みですまたはREST API、どちらもcontent-typeがなくても機能します。

以下のコードを使用してcontent-typeを指定してみてください。

 SharedAccessFileHeaders header = new SharedAccessFileHeaders()
 {
     ContentDisposition = "attachment",
     ContentType = "image/jpeg"
 };
string sasToken = file.GetSharedAccessSignature(sharedPolicy,header);
3
Jerry Liu

これまでのところ、私が見つけたコンテンツタイプの唯一の修正は次のとおりです。

  1. Microsoft Azureストレージエクスプローラーを使用して、コンテンツタイプの文字列を手動で変更します。ダイアログを表示するには、ファイルを右クリックし、プロパティを左クリックする必要があります。
  2. MicrosoftのWindowsAzure.Storage Nugetパッケージを使用してプログラムでファイルを変更します。
  3. 自分のWebサイト経由でファイルをダウンロードし、直接アクセスできないようにします。

私にとって、これらのどれも許容できる選択肢ではありません。最初の2つは、ユーザーがポータルまたはMicrosoft Azure Storage Exploreを介してファイルをアップロードし、コンテンツタイプの変更を忘れた場合に、間違いを引き起こす可能性があります。また、この問題を監視および修正するためのAzure FunctionsまたはWebジョブを記述したくありません。

Microsoft Azureストレージエクスプローラまたはポータル経由でアップロードする場合、BLOBストレージには同じ問題がないため、コストははるかに低く、両方ともSASトークンで機能します。代わりにBLOBストレージに移行しています。ドライブをローカルコンピューターにマウントする機能を失い、Beyond Compareなどを使用してファイル比較を実行しますが、これは私たちが生活できる欠点です。

この問題を修正する上記の解決策よりも優れた解決策がある場合は、喜んで反対票を投じます。しかし、マイクロソフトはこの問題を修正するために変更を加える必要があると思います。

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