32

在我们的应用程序中,我们让用户能够将文档上传到 Windows azure blob 存储帐户。上传文档或图像后,它会被分配一些 url (https://name.blob.core.windows.net/container/file-name.jpg)。如果文档是图像或 pdf 或浏览器可以呈现的某些文件,我们会尝试在浏览器中显示它,而不需要用户下载文件。如果我们只是打开一个新窗口或选项卡并将用户定向到 IE 中的 blob uri,则图像或 pdf 会在浏览器中正确呈现。但是,如果我们尝试在 Chrome、FireFox 或 Safari 中打开一个指向 uri 的新窗口,它只会下载文件而不是在浏览器中显示它。

有没有办法强制后三个浏览器只显示文件而不是下载文件?

4

5 回答 5

58

这是因为您没有设置 blob 的内容类型属性(默认为 application/octet-stream,在大多数浏览器中会触发下载)。如果您希望 PDF 文件正确显示,您需要将 PDF 文件的内容类型更改为application/pdf(jpeg 文件为 image/jpeg)。

您可以使用 Azure Storage Explorer、Cloud Storage Studio、CloudBerry、CloudXplorer 等常用工具或使用 SDK 更改内容类型。请注意,其中一些工具会在上传文件后自动将内容类型设置为正确的类型。

于 2012-08-04T05:25:04.123 回答
28
   blob.Properties.ContentType = "application/pdf";

//通过扩展名获取文件的内容类型

    public static string GetFileContentType(string FilePath)
    {
        string ContentType = String.Empty;
        string Extension = Path.GetExtension(FilePath).ToLower();

        switch (Extension)
        {
            case ConstantUtility.FILE_EXTENSION_PDF:
                ContentType = "application/pdf";
                break;
            case ConstantUtility.FILE_EXTENSION_TXT:
                ContentType = "text/plain";
                break;
            case ConstantUtility.FILE_EXTENSION_BMP:
                ContentType = "image/bmp";
                break;
            case ConstantUtility.FILE_EXTENSION_GIF:
                ContentType = "image/gif";
                break;
            case ConstantUtility.FILE_EXTENSION_PNG:
                ContentType = "image/png";
                break;
            case ConstantUtility.FILE_EXTENSION_JPG:
                ContentType = "image/jpeg";
                break;
            case ConstantUtility.FILE_EXTENSION_JPEG:
                ContentType = "image/jpeg";
                break;
            case ConstantUtility.FILE_EXTENSION_XLS:
                ContentType = "application/vnd.ms-excel";
                break;
            case ConstantUtility.FILE_EXTENSION_XLSX:
                ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
                break;
            case ConstantUtility.FILE_EXTENSION_CSV:
                ContentType = "text/csv";
                break;
            case ConstantUtility.FILE_EXTENSION_HTML:
                ContentType = "text/html";
                break;
            case ConstantUtility.FILE_EXTENSION_XML:
                ContentType = "text/xml";
                break;
            case ConstantUtility.FILE_EXTENSION_ZIP:
                ContentType = "application/zip";
                break;
            default:
                ContentType = "application/octet-stream";
                break;

        }


        return ContentType;
    }

在保存 blob 时使用它来设置 blob 的内容类型。

设置存储在 Blob 上的媒体文件的内容类型

于 2012-11-22T15:21:13.110 回答
3

对于通过 PowerShell 上传文件的用户,请使用以下语法在上传期间设置内容类型。

Set-AzureStorageBlobContent -File <localFilePath> -Container <containerName> -Properties @{"ContentType"="text/plain"} -Context $ctx

上面我将 blob 内容类型设置为 text/plain,这在上传将与模板一起使用的 JSON 和 HTML 文件时很有用。更多内容类型标头值列表在这里

于 2017-03-19T22:56:02.990 回答
1

如果使用 Azure SDK (12.x+),则需要使用传入上传方法的 BlobHttpHeaders(而不是 blob.Properties.ContentType)进行更改。

例如:

    var header = new BlobHttpHeaders();
    header.ContentType = "image/jpeg";

    var response = await blobClient.UploadAsync(stream, header);
于 2020-01-08T15:07:45.080 回答
0
public String sasURL(String filePath) throws URISyntaxException, StorageException, InvalidKeyException {
    CloudBlockBlob cloudBlockBlob = cloudBlobContainer.getBlockBlobReference(filePath);
    SharedAccessBlobPolicy sasPolicy = new SharedAccessBlobPolicy();
    GregorianCalendar calendar = new GregorianCalendar();
    calendar.add(Calendar.HOUR, 3);
    sasPolicy.setSharedAccessExpiryTime(calendar.getTime());
    sasPolicy.setPermissions(EnumSet.of(SharedAccessBlobPermissions.READ, SharedAccessBlobPermissions.LIST));
    SharedAccessBlobHeaders sharedAccessBlobHeaders = new SharedAccessBlobHeaders();
    sharedAccessBlobHeaders.setContentType(MediaType.APPLICATION_PDF_VALUE);
    String sas = cloudBlockBlob.generateSharedAccessSignature(sasPolicy, sharedAccessBlobHeaders,null);
    return cloudBlockBlob.getUri()+"?"+sas;
}
于 2022-02-24T06:13:20.977 回答