Встановіть тип вмісту медіа-файлів, що зберігаються на Blob


76

У нас є веб-сайт, розміщений на Azure. Він заснований на носіях, і ми використовуємо JWPlayer для відтворення мультимедіа з псевдоспіром HTTP. Медіафайли зберігаються на BLOB-пам'яті у 3 форматах - mp4, ogg, webm.

Проблема полягає в тому, що тип вмісту мультимедійних файлів встановлюється як додаток / октет-потік для всіх типів. Через це виникають деякі проблеми у відтворенні мультимедіа та на панелі виконання.

Як я можу встановити відповідний тип вмісту для файлів, що зберігаються на BLOB-пам'яті (наприклад - video / mp4, video / ogg, video / webm)?

Я не хочу робити це вручну для кожного файлу, переходячи в інтерфейс BLOB. Має бути якийсь інший спосіб зробити це, про що я не знаю. Можливо, сортується файл конфігурації, файл налаштувань тощо. Або, можливо, блок коду для встановлення типу Content для всіх файлів, що зберігаються в папці.

Будь-які пропозиції? Дякую

Відповіді:


129

Це має спрацювати:

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.


1
@smarx: Чи можна також зробити те саме в CDN, stackoverflow.com/questions/21847663/…
Хітеш

1
Чи немає можливості встановити це безпосередньо на порталі Azure? без кодування
Еміль,

4
Ось допис у блозі із вичерпним переліком розширень для відображення mimetype. ppolyzos.com/2015/10/27/…
dragon788

1
Можливо, варто згадати, що якщо у вас є доступ до System.Web та .NET 4.5 або вище, ви можете зателефонувати MimeMapping.GetMimeMapping ("somefile.mp4"), щоб отримати тип вмісту. Детальніше див. У MSDN .
Девід Йейтс

16

На жаль, прийнята відповідь тут наразі не працює для останнього пакета 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);

14

Це приклад роботи для завантаження відео в Azure Blob Storage із правильним типом вмісту:

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 />";
}

1
На даний момент це не працює з поточними пакетами.
Кері Річардсон

0

ось що я роблю

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

0

З Azure Storage v10 SDK, згустки можуть бути завантажені , BlockBlobURLяк вказівку на Node.js QUICKSTART :

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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.