2012-04-06 117 views
47

我们有一个托管在Azure上的网站。它是基于媒体的,我们正在使用JWPlayer来播放具有HTTP伪流控的媒体。媒体文件以三种格式存储在blob上 - mp4,ogg,webm。设置存储在Blob上的媒体文件的内容类型

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

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

我不想为每个文件手动执行blob接口。必须有其他的方式来做到这一点,我不知道。也许一个配置文件,设置文件等排序。或者可能是一个代码块来为存储在文件夹中的所有文件设置Content-type。

有什么建议吗? 感谢

回答

87

这应该工作:

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语句。

+0

由于上传视频smarx为你提供帮助。 – 2012-08-27 11:25:21

+1

@smarx:是否也可以在CDN中做同样的事情,http://stackoverflow.com/questions/21847663/changing-video-content-type-mime-type-in​​-cdn-in-drupal-7 – Hitesh 2014-02-19 10:11:02

+1

是否有可能直接在Azure Portal上设置?没有编码 – batmaci 2016-10-19 15:54:15

8

这是工作,例如将视频上传到Azure的Blob存储与正确的Content-Type:

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; 
} 
0

使用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 />"; 
} 
+0

这不适用于当前的软件包截至目前。 – 2017-12-14 20:44:54