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

Posted

技术标签:

【中文标题】设置存储在 Blob 上的媒体文件的内容类型【英文标题】:Set Content-type of media files stored on Blob 【发布时间】:2012-04-19 21:21:03 【问题描述】:

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

问题是媒体文件的内容类型设置为所有类型的应用程序/八位字节流。因此,媒体播放和进度条存在一些问题。

如何设置存储在 blob 上的文件的适当内容类型(例如 - video/mp4、video/ogg、video/webm)?

我不想通过进入 blob 界面手动为每个文件执行此操作。必须有其他一些我不知道的方法来做到这一点。也许是配置文件、设置文件等。或者可能是一个代码块来为存储在文件夹中的所有文件设置内容类型。

有什么建议吗? 谢谢

【问题讨论】:

【参考方案1】:

这应该可行:

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();

或者设置一个字典,这样你就不用写一堆 if 语句了。

【讨论】:

@smarx : 是否也可以在 CDN 中做同样的事情,***.com/questions/21847663/… 难道不能直接在 Azure Portal 上进行设置吗?无需编码 这是一篇博客文章,其中包含对 mimetype 映射的扩展的完整列表。 ppolyzos.com/2015/10/27/… 可能值得一提的是,如果您可以访问 System.Web 和 .NET 4.5 或更高版本,则可以调用 MimeMapping.GetMimeMapping("somefile.mp4") 来获取内容类型。有关详细信息,请参阅MSDN。【参考方案2】:

很遗憾,此处接受的答案目前不适用于最新的 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  ContentType = "image/jpeg" ;
 
var uploadedBlob = await blob.UploadAsync(YOURSTREAM, new BlobUploadOptions  HttpHeaders = blobHttpHeader );

YOURSTREAM 可以是 new BinaryData(byte[])

【讨论】:

一切正常。在我看来,目前这个答案应该被标记为已接受。【参考方案3】:

这是使用正确的 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;

【讨论】:

【参考方案4】:

使用 Azure Storage v10 SDK,可以使用 BlockBlobURL 作为 instructed in the Node.js quickstart 上传 blob:

const 
  Aborter,
  BlockBlobURL,
  ContainerURL,
  ServiceURL,
  SharedKeyCredential,
  StorageURL,
  uploadFileToBlockBlob
 = require("@azure/storage-blob");

const containerName = "demo";
const blobName = "quickstart.txt";
const content = "hello!";

const credentials = new SharedKeyCredential(
  STORAGE_ACCOUNT_NAME,
  ACCOUNT_ACCESS_KEY
);
const pipeline = StorageURL.newPipeline(credentials);
const serviceURL = new ServiceURL(
  `https://$STORAGE_ACCOUNT_NAME.blob.core.windows.net`,
  pipeline
);

const containerURL = ContainerURL.fromServiceURL(serviceURL, containerName);
const blockBlobURL = BlockBlobURL.fromContainerURL(containerURL, blobName);

const aborter = Aborter.timeout(30 * ONE_MINUTE);
await blockBlobURL.upload(aborter, content, content.length);

然后可以在上传后使用setHTTPHeaders方法设置内容类型:

// Set content type to text/plain
await blockBlobURL.setHTTPHeaders(aborter,  blobContentType: "text/plain" );

可以使用uploadFileToBlockBlob 方法从@azure/storage-blob 上传文件。

【讨论】:

【参考方案5】:

使用php,可以通过如下设置内容类型来上传视频

$blobRestProxy = ServicesBuilder::getInstance()->createBlobService($connectionString);
//upload
$blob_name = "video.mp4";
$content = fopen("video.mp4", "r");

$options = new CreateBlobOptions();
$options->setBlobContentType("video/mp4");
try 
    //Upload blob
    $blobRestProxy->createBlockBlob("containername", $blob_name, $content, $options);
    echo "success";
 catch(ServiceException $e)
    $code = $e->getCode();
    $error_message = $e->getMessage();
    echo $code.": ".$error_message."<br />";

【讨论】:

这不适用于目前的软件包。【参考方案6】:

这就是我的工作

BlobHTTPHeaders h = new BlobHTTPHeaders();
String blobContentType = "image/jpeg";
h.withBlobContentType(blobContentType);
blobURL.upload(Flowable.just(ByteBuffer.wrap(Files.readAllBytes(img.toPath()))), img.length(), h, null, null, null)
.subscribe(resp-> 
  System.out.println("Completed upload request.");
  System.out.println(resp.statusCode());
);

【讨论】:

【参考方案7】:

您可以使用 Azure 存储资源管理器手动执行此操作。右键单击要更改的文件并选择属性。转到 ContentType 并将值编辑为正确的值,即“video\mp4”

【讨论】:

你能编辑这篇文章让它更自信吗?请注意,问题是“我不想通过进入 blob 界面手动为每个文件执行此操作”【参考方案8】:

在python中

azure_connection_str = libc.retrieve.get_any_secret('AZURE_STORAGE_CONNECTION')
blob_service_client = BlobServiceClient.from_connection_string(azure_connection_str)
blobs = blob_service_client.list_blobs()
my_content_settings = ContentSettings(content_type='video/mp4')

for blob in blobs:
    blob_client = blob_service_client.container_client.get_blob_client(blob)
    blob_client.set_http_headers(content_settings=my_content_settings)

【讨论】:

以上是关于设置存储在 Blob 上的媒体文件的内容类型的主要内容,如果未能解决你的问题,请参考以下文章

为啥 git 将文件内容存储为 blob?

Azure 上的 Django 应用错误地从 Azure Blob 加载静态文件

blob 上的错误内容类型无法打开 img / 文件已损坏

将 EPiserver 媒体 blob 迁移到 Azure 存储帐户

Azure 媒体播放器源清单

通过 Azure 媒体服务从 Azure 云存储 Blob 流式传输 mp3(仅限音频)