web-dev-qa-db-fra.com

Définir le type de contenu des fichiers multimédias stockés sur Blob

Nous avons un site Web hébergé sur Azure. Il est basé sur les médias et nous utilisons JWPlayer pour lire des médias avec un pseudostreaming HTTP. Les fichiers multimédias sont stockés sur blob dans 3 formats - mp4, ogg, webm.

Le problème est que le type de contenu des fichiers multimédias est défini comme application/octet-stream pour tous les types. Pour cette raison, il y a des problèmes de lecture multimédia et de barre de progression.

Comment puis-je définir le type de contenu approprié des fichiers stockés sur blob (comme - vidéo/mp4, vidéo/ogg, vidéo/webm)?

Je ne veux pas le faire manuellement pour chaque fichier en allant dans l'interface blob. Il doit y avoir une autre manière de le faire que je ne connais pas. Peut-être un fichier de configuration, un fichier de paramètres, etc. trie. Ou peut-être un bloc de code pour configurer le type de contenu pour tous les fichiers stockés dans un dossier.

Aucune suggestion? Merci

64
Rahul Patwa

Cela devrait fonctionner:

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

Ou créez un dictionnaire pour ne pas avoir à écrire un tas d'instructions if.

113
smarx

Voici un exemple de travail pour télécharger une vidéo vers Azure Blob Storage avec le bon type de contenu:

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

voici ce que je fais

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

En utilisant php, on peut télécharger la vidéo en définissant le type de contenu comme suit

$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