Set Content-тип медиафайлов, хранящихся на Blob
У нас есть сайт, размещенный в Azure. Это СМИ, а мы с помощью JWPlayer для воспроизведения медиа-файлов с HTTP pseudostreaming. Медиа-файлы хранятся в BLOB-объект в 3-х форматах - в формате mp4, OGG и видео в форматах WebM.
проблема заключается в том, что тип содержимого медиафайлов задается как application / octet-stream для всех типов. Из-за этого есть некоторые проблемы в воспроизведении мультимедиа и индикатор выполнения.
Как я могу установить соответствующий тип содержимого файлов, хранящихся на blob (например, - video / mp4, видео / ogg, видео / webm)?
Я не хочу делать это вручную для каждого файла в BLOB интерфейс. Должен быть другой способ сделать это, который я не знаю. Возможно, конфигурационный файл, файл настроек и т. д. Или, возможно, блок кода для настройки типа содержимого для всех файлов, хранящихся в папке.
какие предложения? Спасибо
4 ответов
Это должно работать:
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.
Это пример работы для загрузки видео в хранилище 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;
}
используя 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 />";
}
вот что я делаю
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());
});