Blob에 저장된 미디어 파일의 내용 유형 설정
우리는 Azure에서 호스팅되는 웹사이트를 가지고 있습니다.미디어 기반이며, JWPlayer를 사용하여 HTTP 유사 스트리밍으로 미디어를 재생하고 있습니다.미디어 파일은 mp4, ogg, webm의 세 가지 형식으로 BLOB에 저장됩니다.
문제는 미디어 파일의 콘텐츠 유형이 모든 유형에 대해 응용 프로그램/옥텟 스트림으로 설정되어 있다는 것입니다.이로 인해 미디어 재생 및 진행 표시줄에 몇 가지 문제가 있습니다.
BLOB에 저장된 적절한 컨텐츠 유형의 파일을 설정하려면 어떻게 해야 합니까(예: 비디오/mp4, 비디오/로그, 비디오/웹m)?
각 파일에 대해 Blob 인터페이스를 사용하여 수동으로 수행하고 싶지 않습니다.제가 모르는 다른 방법이 있을 것입니다.구성 파일, 설정 파일 등이 정렬됩니다.또는 폴더에 저장된 모든 파일에 대한 내용 유형을 설정하는 코드 블록일 수 있습니다.
좋은 의견이라도 있나?감사해요.
이렇게 하면 됩니다.
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 문을 많이 작성할 필요가 없습니다.
안타깝게도, 여기서 수락된 답변은 현재 최신 SDK(12.x.+)에 대해 작동하지 않습니다.
최신 SDK에서는 BlobHttp를 통해 컨텐츠 유형을 설정해야 합니다.머리글.
var blobServiceClient = new BlobServiceClient("YOURCONNECTIONSTRING");
var containerClient = blobServiceClient.GetBlobContainerClient("YOURCONTAINERNAME");
var blob = containerClient.GetBlobClient("YOURFILE.jpg");
var blobHttpHeader = new BlobHttpHeaders { ContentType = "image/jpeg" };
var uploadedBlob = await blob.UploadAsync(YOURSTREAM, new BlobUploadOptions { HttpHeaders = blobHttpHeader });
당신의 스트림은new BinaryData(byte[])
다음은 올바른 Content-Type을 사용하여 Azure Blob 스토리지에 비디오를 업로드하는 작업 예입니다.
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;
}
애저랑.보관소.블로그(12.8.4), 아래와 같이 파일의 내용 유형을 설정할 수 있습니다.기본적으로 Azure Storage는 응용 프로그램/octet-stream에 파일을 저장합니다. *.svg 파일이 html로 제대로 렌더링되지 않는 경우.따라서 BLOB에 업로드하는 동안 *.svg 파일을 컨텐츠 유형 image/svg+xml의 zure bLOB 스토리지에 저장해야 합니다.
아래는 제가 작업한 코드 샘플입니다.
BlobServiceClient blobServiceClient = new BlobServiceClient("CONNECTIONSTRING");
BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient("CONTAINERNAME");
BlobClient blobClient = containerClient.GetBlobClient("BLOBNAME");
try
{
Stream stream = file.OpenReadStream();
await blobClient.UploadAsync(stream, true);
blobClient.SetHttpHeaders(new BlobHttpHeaders() { ContentType = file.ContentType });
}
헤더의 ContentType Set은 blobClient 바로 아래에 있어야 합니다.Async()를 업로드합니다.
Azure Storage v10 SDK를 사용하면 다음을 사용하여 Blob을 업로드할 수 있습니다.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
.
인 파이썬
azure_connection_str = libc.retrieve.get_any_secret('AZURE_STORAGE_CONNECTION')
blob_service_client = BlobServiceClient.from_connection_string(azure_connection_str)
blobs = blob_service_client.list_blobs()
my_content_settings = ContentSettings(content_type='video/mp4')
for blob in blobs:
blob_client = blob_service_client.container_client.get_blob_client(blob)
blob_client.set_http_headers(content_settings=my_content_settings)
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());
});
중간에 파일 업로드에 사용되는 API가 있다면 다음과 같은 작업을 수행할 수 있습니다.
사용.Azure.Storage.Files.Datalake v12.12.1
데이터레이크 스토리지 Gen v2를 사용하여 컨텐츠 유형을 지정할 수 있습니다.DataLakeFileUploadOptions
.
using Azure.Storage.Files
using Microsoft.AspNetCore.StaticFiles;
(...)
public async Task<IActionResult> UploadAsync(string container, string uploadDirectoryPath,
IFormFile file) {
var dataLakeServiceClient = new DataLakeServiceClient(connString);
var dataLakeFileSystemClient = dataLakeServiceClient.GetFileSystemClient(container);
var dataLakeFileClient = dataLakeFileSystemClient
.GetFileClient(Path.Combine(uploadDirectoryPath, file.FileName));
var fileStream = file.OpenReadStream();
var mimeType = GetMimeType(file.FileName);
var uploadOptions = new DataLakeFileUploadOptions()
{
HttpHeaders = new PathHttpHeaders() { ContentType = mimeType }
};
await dataLakeFileClient.UploadAsync(fileStream, uploadOptions);
return Ok();
}
private string GetMimeType(string fileName)
{
var provider = new FileExtensionContentTypeProvider();
if (!provider.TryGetContentType(fileName, out var contentType))
{
contentType = "application/octet-stream";
}
return contentType;
}
여기서 사용하는 콘텐츠 유형 및 GetMimeType 메서드에 대해 자세히 알아봅니다.
Azure Storage Explorer를 사용하여 수동으로 이 작업을 수행할 수 있습니다.변경할 파일을 마우스 오른쪽 단추로 클릭하고 속성을 선택합니다.콘텐츠로 이동값을 입력하고 올바른 값으로 편집합니다."비디오\mp4"
언급URL : https://stackoverflow.com/questions/10040403/set-content-type-of-media-files-stored-on-blob
'programing' 카테고리의 다른 글
볼륨을 사용하여 도킹된 postgres 데이터베이스에서 데이터를 유지하는 방법 (0) | 2023.05.07 |
---|---|
Http 메서드에서 생성된 관찰 가능 항목의 구독을 취소할 필요가 있습니까? (0) | 2023.05.07 |
응답 이유.리디렉션으로 인해 시스템이 발생합니다.스레드화.스레드 중단 예외? (0) | 2023.05.07 |
Python Pandas read_exceltype str은 읽을 때 또는 to_csv를 통해 쓸 때 nan을 공백(')으로 대체합니다. (0) | 2023.05.07 |
긴 문자열을 여러 줄로 나누는 방법 (0) | 2023.05.07 |