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

Rah*_*twa 66 content-type azure jwplayer

我们在Azure上托管了一个网站.它是基于媒体的,我们正在使用JWPlayer来播放带有HTTP伪流的媒体.媒体文件以3种格式存储在blob上 - mp4,ogg,webm.

问题是媒体文件的内容类型被设置为所有类型的application/octet-stream.因此,媒体播放和进度条中存在一些问题.

如何设置存储在blob上的相应内容类型的文件(如 - video/mp4,video/ogg,video/webm)?

我不希望通过进入blob接口手动为每个文件执行此操作.必须有其他方法来做这件事,我不知道.也许配置文件,设置文件等排序.或者也许是一个代码块,用于为存储在文件夹中的所有文件设置Content-type.

有什么建议?谢谢

use*_*559 120

这应该工作:

var storageAccount = CloudStorageAccount.Parse("YOURCONNECTIONSTRING");
var blobClient = storageAccount.CreateCloudBlobClient();

var blobs = blobClient
    .GetContainerReference("thecontainer")
    .ListBlobs(useFlatBlobListing: true)
    .OfType<CloudBlockBlob>();

foreach (var blob in blobs)
{
    if (Path.GetExtension(blob.Uri.AbsoluteUri) == ".mp4")
    {
        blob.Properties.ContentType = "video/mp4";
    }
    // repeat ad nauseam
    blob.SetProperties();
}
Run Code Online (Sandbox Code Playgroud)

或者设置一个字典,这样你就不必编写一堆if语句.

  • 这是一篇博客文章,其中包含mimetype映射扩展的完整列表.https://ppolyzos.com/2015/10/27/apply-proper-content-type-to-files-in-azure-storage-containers-based-on-file-extensions/ (4认同)
  • 可能值得一提的是,如果您有权访问 System.Web 和 .NET 4.5 或更高版本,则可以调用 MimeMapping.GetMimeMapping("somefile.mp4") 来获取内容类型。有关更多详细信息,请参阅 [MSDN](https://learn.microsoft.com/en-us/dotnet/api/system.web.mimemapping.getmimemapping?view=netframework-4.7.2)。 (2认同)

Meh*_*ral 37

不幸的是,这里接受的答案目前不适用于最新的 SDK (12.x.+)

使用最新的 SDK,应通过 BlobHttpHeaders 设置内容类型。

var blobServiceClient = new BlobServiceClient("YOURCONNECTIONSTRING");
var containerClient = blobServiceClient.GetBlobContainerClient("YOURCONTAINERNAME");
var blob = containerClient.GetBlobClient("YOURFILE.jpg");

var blobHttpHeader = new BlobHttpHeaders();
blobHttpHeader.ContentType = "image/png";
 
var uploadedBlob = await blob.UploadAsync(YOURSTREAM, blobHttpHeader);
Run Code Online (Sandbox Code Playgroud)

  • 运行良好。在我看来,目前这个答案应该被标记为已接受。 (2认同)

小智 13

这是使用正确的Content-Type将视频上传到Azure Blob存储的工作示例:

public static String uploadFile(
     CloudBlobContainer container,String blobname, String fpath) {

    CloudBlockBlob blob;
    try {
        blob = container.getBlockBlobReference(blobname);
        File source = new File(fpath);

        if (blobname.endsWith(".mp4")) {
            System.out.println("Set content-type: video/mp4");
            blob.getProperties().setContentType("video/mp4");
        }

        blob.upload(new FileInputStream(source), source.length());

        return blob.getUri().toString();
    } catch (URISyntaxException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (StorageException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return null;
}
Run Code Online (Sandbox Code Playgroud)


Amr*_*yar 8

使用Azure.Storage.Blogs(12.8.4),我们可以如下设置文件的内容类型。默认情况下,Azure 存储将文件存储在 application/octet-stream 中,如果是 *.svg 文件,则无法在 html 中正确呈现。因此,在上传到 blob 时,我们必须将 *.svg 文件保存在内容类型为 image/svg+xml 的 azure blob 存储中。

下面是我工作的代码示例。

  BlobServiceClient blobServiceClient = new BlobServiceClient("CONNECTIONSTRING");
  BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient("CONTAINERNAME");
  BlobClient blobClient = containerClient.GetBlobClient("BLOBNAME");
  try
  {

    Stream stream = file.OpenReadStream();
    await blobClient.UploadAsync(stream, true);
    blobClient.SetHttpHeaders(new BlobHttpHeaders() { ContentType = file.ContentType });
  }
Run Code Online (Sandbox Code Playgroud)

标头上设置的 ContentType 应放置在 blobClient.UploadAsync() 的正下方。