我已经将存储帐户从V1升级到V2,认为这可能是问题所在,但它没有解决问题。
有人知道我可以尝试什么来使Azure文件存储使用带有SAS令牌的URL返回正确的内容类型吗?
application/octet-stream
。但我无法重现您的下载问题。 SharedAccessFileHeaders header = new SharedAccessFileHeaders()
{
ContentDisposition = "attachment",
ContentType = "image/jpeg"
};
string sasToken = file.GetSharedAccessSignature(sharedPolicy,header);
image/jpeg
。 - Jerry Liu看一下这个 - Microsoft SAS 示例
如果您不想在 Azure 中更新文件的内容类型,或者更新所有现有文件的内容类型太麻烦了,您也可以通过 SAS 令牌传递所需的内容类型。参数rsct是您指定所需内容类型的地方。
@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
是您的回调实现
file.Create
的ShareFileHttpHeaders参数。ShareFileClient file = directory.GetFileClient(fileName);
using FileStream stream = File.OpenRead(@"C:\Temp\Amanita_muscaria.jpg");
file.Create(stream.Length, new ShareFileHttpHeaders { ContentType = ContentType(fileName) });
file.UploadRange(new HttpRange(0, stream.Length),stream);
ContentType(fileName)
是文件名的评估,例如:
if (fileName.EndsWith(".txt")) return "text/plain";
// etc
我知道我并没有回答这个问题,但我相信我的答案是适用的。我曾经遇到过同样的问题,我需要将存储帐户设置为静态网站。每当我上传一个 blob 到容器中时,默认类型是“application/octet-stream”,因此 index.html 被下载而不是被显示。
要更改文件类型,请执行以下操作:
# Get Storage Account for its context
$storageAccount = Get-AzStorageAccount -ResourceGroupName <Resource Group Name> -Name <Storage Account Name>
# Get Blobs inside container of storage account
$blobs = Get-AzStorageBlob -Context $storageAccount.Context -Container <Container Name>
foreach ($blob in $blobs) {
$CloudBlockBlob = [Microsoft.Azure.Storage.Blob.CloudBlockBlob] $blob.ICloudBlob
$CloudBlockBlob.Properties.ContentType = <Desired type as string>
$CloudBlockBlob.SetProperties()
}
基于这个答案:Twong answer
例如,如果您正在使用.NET(C#)API从ShareFileClient(ShareFileClient class description)代理/生成SAS URL:
if (downloadClient.CanGenerateSasUri)
{
var sasBuilder = new ShareSasBuilder(ShareFileSasPermissions.Read, DateTimeOffset.Now.AddDays(10))
{
ContentType = "application/pdf",
ContentDisposition = "inline"
};
return downloadClient.GenerateSasUri(sasBuilder);
}
上述示例设置了10天的令牌,用于打开PDF文件,该文件将在新的浏览器选项卡中打开(特别是在Apple iOS上)。
我没有尝试过这个,但理想情况下,您可以使用ClientOptions指定不同的头部。它应该是这个样子:
ClientOptions options = new ClientOptions();
HttpHeader httpHeaders = new HttpHeader("Content-Type", "application/pdf");
options.setHeaders(Collections.singleton(httpHeaders));
blobClient = new BlobClientBuilder()
.endpoint(<SAS-URL>)
.blobName("hello")
.clientOptions(options)
.buildClient();
blobServiceSasSignatureValues.setContentType("image/jpeg");