Set Content-тип медиафайлов, хранящихся в большом двоичном объекте
У нас есть веб-сайт, размещенный на Azure. Он основан на медиа, и мы используем JWPlayer для воспроизведения мультимедиа с псевдопотоком HTTP. Медиа-файлы хранятся в 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 с правильным типом контента:
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()); });