web-dev-qa-db-ger.com

Stellen Sie den Inhaltstyp der auf Blob gespeicherten Mediendateien ein

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

Das Problem ist, dass der Inhaltstyp von Mediendateien für alle Typen als application/octet-stream festgelegt ist. Aufgrund dessen gibt es einige Probleme bei der Medienwiedergabe und der Fortschrittsanzeige.

Wie kann ich den geeigneten Inhaltstyp für Dateien festlegen, die auf dem Blob gespeichert sind (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 werden eine Konfigurationsdatei, eine Einstellungsdatei usw. sortiert. Oder vielleicht ein Codeblock, um den Inhaltstyp für alle in einem Ordner gespeicherten Dateien festzulegen.

Irgendwelche Vorschläge? Vielen Dank

64
Rahul Patwa

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 nicht viele if-Anweisungen schreiben müssen.

113
smarx

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;
}
13
Vadim Dobroskok

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
user5611150

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