Legen Sie den Inhaltstyp der auf Blob gespeicherten Mediendateien fest


75

Wir haben eine Website auf Azure gehostet. Es ist medienbasiert und wir verwenden JWPlayer, um Medien mit HTTP-Pseudostreaming wiederzugeben. Die Mediendateien werden auf blob in 3 Formaten gespeichert - mp4, ogg, webm.

Das Problem ist, dass der Inhaltstyp von Mediendateien für alle Typen als Anwendungs- / Oktett-Stream festgelegt ist. Aus diesem Grund gibt es einige Probleme bei der Medienwiedergabe und der Fortschrittsanzeige.

Wie kann ich den entsprechenden Inhaltstyp für auf Blob gespeicherte Dateien festlegen (z. B. Video / MP4, Video / Ogg, Video / WebM)?

Ich möchte es nicht manuell für jede Datei tun, indem ich in die Blob-Oberfläche gehe. Es muss einen anderen Weg geben, den ich nicht kenne. Möglicherweise wird eine Konfigurationsdatei, eine Einstellungsdatei usw. sortiert. Oder vielleicht ein Codeblock zum Einrichten des Inhaltstyps für alle in einem Ordner gespeicherten Dateien.

Irgendwelche Vorschläge? Vielen Dank

Antworten:


128

Das sollte funktionieren:

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

Oder richten Sie ein Wörterbuch ein, damit Sie keine if-Anweisungen schreiben müssen.


1
@smarx: Ist es auch möglich, dasselbe in CDN zu tun, stackoverflow.com/questions/21847663/…
Hitesh

1
Gibt es keine Möglichkeit, dies direkt in Azure Portal einzurichten? ohne Kodierung
Emil

4
Hier ist ein Blog-Beitrag mit einer umfassenden Liste der Erweiterungen für Mimetype-Zuordnungen. ppolyzos.com/2015/10/27/…
dragon788

1
Es kann erwähnenswert sein, dass Sie, wenn Sie Zugriff auf System.Web und .NET 4.5 oder höher haben, MimeMapping.GetMimeMapping ("somefile.mp4") aufrufen können, um den Inhaltstyp abzurufen. Weitere Informationen finden Sie unter MSDN .
David Yates

14

Dies ist ein Arbeitsbeispiel zum Hochladen von Videos in Azure Blob Storage mit dem richtigen Inhaltstyp:

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

11

Leider funktioniert die hier akzeptierte Antwort derzeit nicht für das neueste SDK (12.x. +).

Mit dem neuesten SDK sollte der Inhaltstyp über BlobHttpHeaders festgelegt werden.

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

0

Mit PHP kann man das Video hochladen, indem man den Inhaltstyp wie folgt einstellt

$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
Dies funktioniert derzeit nicht mit aktuellen Paketen.
Carey Richardson

0

Hier ist was ich tue

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

Mit Azure Storage v10 SDK können Blobs mit hochgeladen werden , BlockBlobURLwie in den Node.js instruiert 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);

Anschließend kann der Inhaltstyp nach dem Upload mit der folgenden setHTTPHeadersMethode festgelegt werden:

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

Dateien können mit der uploadFileToBlockBlobMethode von hochgeladen werden @azure/storage-blob.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.