source

Azure Blob은 url로 이동할 때 항상 다운로드합니다.

ittop 2023. 4. 27. 22:46
반응형

Azure Blob은 url로 이동할 때 항상 다운로드합니다.

우리의 응용 프로그램에서 우리는 사용자에게 문서를 Windows zure blob 저장 계정에 업로드할 수 있는 기능을 제공합니다.문서나 이미지를 업로드하면 일부 URL(https://name.blob.core.windows.net/container/file-name.jpg) )이 할당됩니다.문서가 브라우저에서 렌더링할 수 있는 이미지, PDF 또는 일부 파일인 경우 사용자가 파일을 다운로드할 필요 없이 브라우저에 표시하려고 합니다.새 창이나 탭을 열고 사용자에게 IE의 Bloburi로 안내하면 이미지나 PDF가 브라우저에서 올바르게 렌더링됩니다.그러나 Chrome, FireFox 또는 Safari에서 uri를 가리키는 새 창을 열려고 하면 브라우저에 파일을 표시하지 않고 다운로드합니다.

후자의 세 브라우저가 파일을 다운로드하지 않고 표시하도록 강제하는 방법이 있습니까?

이는 BLOB의 내용 유형 속성을 설정하지 않았기 때문입니다(기본값은 대부분의 브라우저에서 다운로드를 트리거하는 응용 프로그램/옥텟 스트림).PDF 파일을 올바르게 표시하려면 PDF 파일의 내용 유형을 application/pdf(jpeg 파일의 경우 이미지/jpeg)로 변경해야 합니다.

Azure Storage Explorer, Cloud Storage Studio, CloudBerry, CloudXplor 등과 같은 일반적인 도구를 사용하거나 SDK를 사용하여 콘텐츠 유형을 변경할 수 있습니다. 이러한 도구 중 일부는 파일을 업로드한 후 자동으로 콘텐츠 유형을 올바른 유형으로 설정합니다.

   blob.Properties.ContentType = "application/pdf";

//확장자별로 파일의 내용 유형 가져오기

    public static string GetFileContentType(string FilePath)
    {
        string ContentType = String.Empty;
        string Extension = Path.GetExtension(FilePath).ToLower();

        switch (Extension)
        {
            case ConstantUtility.FILE_EXTENSION_PDF:
                ContentType = "application/pdf";
                break;
            case ConstantUtility.FILE_EXTENSION_TXT:
                ContentType = "text/plain";
                break;
            case ConstantUtility.FILE_EXTENSION_BMP:
                ContentType = "image/bmp";
                break;
            case ConstantUtility.FILE_EXTENSION_GIF:
                ContentType = "image/gif";
                break;
            case ConstantUtility.FILE_EXTENSION_PNG:
                ContentType = "image/png";
                break;
            case ConstantUtility.FILE_EXTENSION_JPG:
                ContentType = "image/jpeg";
                break;
            case ConstantUtility.FILE_EXTENSION_JPEG:
                ContentType = "image/jpeg";
                break;
            case ConstantUtility.FILE_EXTENSION_XLS:
                ContentType = "application/vnd.ms-excel";
                break;
            case ConstantUtility.FILE_EXTENSION_XLSX:
                ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
                break;
            case ConstantUtility.FILE_EXTENSION_CSV:
                ContentType = "text/csv";
                break;
            case ConstantUtility.FILE_EXTENSION_HTML:
                ContentType = "text/html";
                break;
            case ConstantUtility.FILE_EXTENSION_XML:
                ContentType = "text/xml";
                break;
            case ConstantUtility.FILE_EXTENSION_ZIP:
                ContentType = "application/zip";
                break;
            default:
                ContentType = "application/octet-stream";
                break;

        }


        return ContentType;
    }

이를 통해 블럽을 저장하는 동안 블럽의 내용 유형을 설정할 수 있습니다.

Blob에 저장된 미디어 파일의 내용 유형 설정

PowerShell을 통해 파일을 업로드하는 경우 다음 구문을 사용하여 업로드 중에 컨텐츠 유형을 설정합니다.

Set-AzureStorageBlobContent -File <localFilePath> -Container <containerName> -Properties @{"ContentType"="text/plain"} -Context $ctx

위에서 저는 템플릿과 함께 사용할 JSON 및 HTML 파일을 업로드할 때 유용한 Blob 컨텐츠 유형을 text/plain으로 설정했습니다.다른 내용 유형 헤더 값 목록이 여기에 있습니다.

Azure SDK(12.x+)를 사용하는 경우 BlobHttp를 사용해야 하는 변경 사항이 있습니다.(블롭 대신) 업로드 방법으로 전달되는 헤더입니다.특성.내용 유형).

예:

    var header = new BlobHttpHeaders();
    header.ContentType = "image/jpeg";

    var response = await blobClient.UploadAsync(stream, header);
public String sasURL(String filePath) throws URISyntaxException, StorageException, InvalidKeyException {
    CloudBlockBlob cloudBlockBlob = cloudBlobContainer.getBlockBlobReference(filePath);
    SharedAccessBlobPolicy sasPolicy = new SharedAccessBlobPolicy();
    GregorianCalendar calendar = new GregorianCalendar();
    calendar.add(Calendar.HOUR, 3);
    sasPolicy.setSharedAccessExpiryTime(calendar.getTime());
    sasPolicy.setPermissions(EnumSet.of(SharedAccessBlobPermissions.READ, SharedAccessBlobPermissions.LIST));
    SharedAccessBlobHeaders sharedAccessBlobHeaders = new SharedAccessBlobHeaders();
    sharedAccessBlobHeaders.setContentType(MediaType.APPLICATION_PDF_VALUE);
    String sas = cloudBlockBlob.generateSharedAccessSignature(sasPolicy, sharedAccessBlobHeaders,null);
    return cloudBlockBlob.getUri()+"?"+sas;
}

도움이 되는 답변을 주신 sudhAnsu63과 Steve G에게 감사드립니다!

다음은 컨텐츠를 설정하는 비주얼 베이직의 최소 재현 가능 코드 솔루션입니다."upploadImageBlub" 함수를 호출하여 zurebob 저장소에 입력하고 업로드합니다. 컨텐츠 유형을 설정하면 브라우저가 이미지로 수행할 작업을 파악하는 데 도움이 되므로 액세스 시 다운로드를 시작하는 대신 이미지/파일을 표시할 수 있습니다.

별도로, 저는 이것을 당신의 코드에 복사해서 붙여넣을 뿐만 아니라 당신이 당신의 연결 문자열과 파일 이름을 더 동적으로 처리하기를 바랍니다.

            Public Function uploadImageBlob() As String
                ' variables we will need in this function
                Const containerName As String = "exampleContainer"
                Dim azureConnectionString As String = WebConfigurationManager.ConnectionStrings("NameOfConnectionString").ConnectionString

                Dim fileNameWithExtension As String = "example.png"
                Dim filePath As String = "/WhereYourImagesAre/"

                ' requires being able to use path
                Dim blobName As String = Path.GetFileNameWithoutExtension(fileNameWithExtension)

                Dim container As BlobContainerClient = New BlobContainerClient(AzureConnectionString, containerName)
                container.CreateIfNotExists()

                Dim blob As BlobClient = container.GetBlobClient(fileNameWithExtension)

                Dim blobHeader = New Models.BlobHttpHeaders
                blobHeader.ContentType = Me.getFileContentType(fileNameWithExtension) '("image/png")

                blob.UploadAsync(filePath & fileNameWithExtension, blobHeader)
                return "bob upload!!!"
            End Function

            Public Function getFileContentType(pFileWithExtension As String) As String
                Dim ContentType As String = String.Empty
                Dim Extension As String = Path.GetExtension(FilePath).ToLower()
                
                ' may want more extension types based on your needs
                Select Case Extension
                    Case ".gif"
                        ContentType = "image/gif"
                    Case ".jpg"
                        ContentType = "image/jpeg"
                    Case ".jpeg"
                        ContentType = "image/jpeg"
                    Case ".png"
                        ContentType = "image/png"
                End Select
                
                return ContentType;
            End Function

언급URL : https://stackoverflow.com/questions/11805944/azure-blob-always-downloads-when-navigating-to-url

반응형