source

Azure blob을 공개적으로 다운로드할 때 친숙한 파일 이름

manysource 2023. 4. 20. 21:35

Azure blob을 공개적으로 다운로드할 때 친숙한 파일 이름

GUID 이름(또는 다른 이름)으로 blob을 저장할 수 있지만 사용자가 파일 URI http://me.blob.core.windows.net/mycontainer/9BB34783-8F06-466D-AC20-37A03E504E3F을 요청하면 다운로드가 친숙한 이름으로 다운됩니다.MyText.txt?

이제 공유 액세스시그니처 생성 시 content-disposition 헤더를 설정하면 됩니다.

  string sasBlobToken = blob.GetSharedAccessSignature(sharedPolicy, new SharedAccessBlobHeaders()
            {
                ContentDisposition = "attachment; filename=" + friendlyFileName
            });
  string downloadLink = blob.Uri + sasBlobToken;

유저가 Windows Azure 로 파일(블로그)을 다운로드할 수 있도록 하려면 , 다음의 4개의 방법이 있습니다.

  • Direct Download(직접 다운로드)– 컨테이너 액세스를 Public Read Access(공용 읽기 액세스) 또는 Full Public Read Access(풀 퍼블릭 읽기 액세스)로 설정하고 최종 사용자에게 URL을 표시합니다.이 방법의 단점은 분명히 보안입니다.URL이 공개되었을 때 접근을 제어할 방법이 없습니다.다운로드를 검출하거나 다운로드 전후에 코드를 실행하는 방법도 없습니다.

  • API 다운로드– Windows App, Silverlight 등을 실행해야 합니다.또한 앱에 스토어 계정 이름과 키가 포함되어 있어야 합니다.이 경우 보안이 손상될 수 있습니다.특히 같은 계정을 사용하는 고객이 여러 명 있는 경우(물론 전용 컨테이너를 보유할 수도 있습니다).

  • Proxy Download(프록시 다운로드)– 사용자가 서버의 URL에 액세스하도록 합니다.이것에 의해, Azure 로부터 파일이 취득되어 유저에게 송신됩니다.이 방법의 장점은 다운로드를 완전히 제어할 수 있고 다운로드 전/후에 코드를 실행할 수 있으며 Azure URL / 계정 정보를 노출할 필요가 없다는 것입니다.실제로 최종 사용자는 파일이 Azure에 저장되어 있는지조차 알 수 없습니다.이 방법으로 파일명을 덮어쓸 수도 있습니다.단점은 모든 트래픽이 서버를 통과하기 때문에 여기서 병목현상이 발생할 수 있다는 것입니다.

  • 패스스루 다운로드(Azure Shared Access Signature): 시그니처를 생성하여 사용자가 Azure로 리다이렉트되는 URL에 삽입합니다.이 시그니처는 사용자가 제한된 시간 동안 파일에 액세스할 수 있도록 합니다.이것이 가장 좋은 선택일 것입니다.다운로드 전에 커스텀 코드를 실행할 수 있으며 사용자의 최대 다운로드 속도를 보장하며 보안 수준도 향상됩니다.

다음은 사용자에게 파일을 스트리밍하고 파일 이름을 재정의하는 코드 조각입니다.

//Retrieve filenname from DB (based on fileid (Guid))
// *SNIP*
string filename = "some file name.txt"; 

//IE needs URL encoded filename. Important when there are spaces and other non-ansi chars in filename.
if (HttpContext.Current.Request.UserAgent != null &&     HttpContext.Current.Request.UserAgent.ToUpper().Contains("MSIE"))
filename = HttpUtility.UrlEncode(filename, System.Text.Encoding.UTF8).Replace("+", " ");

context.Response.Charset = "UTF-8";
//Important to set buffer to false. IIS will download entire blob before passing it on to user if this is not set to false
context.Response.Buffer = false;
context.Response.AddHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
context.Response.AddHeader("Content-Length", "100122334"); //Set the length the file
context.Response.ContentType = "application/octet-stream";
context.Response.Flush();

//Use the Azure API to stream the blob to the user instantly.
// *SNIP*
fileBlob.DownloadToStream(context.Response.OutputStream);

상세한 것에 대하여는, 다음의 블로그 포스트를 참조해 주세요.http://blog.degree.no/2012/04/downloading-blobs-from-windows-azure/

2013년 11월 현재 Windows Azure Blob Storage에서 컨텐츠 폐기 헤더가 지원됩니다.헤더는 BLOB 작성 시 또는 공유 액세스시그니처를 통해 할당할 수 있습니다.

다운로드하기 쉬운 이름인 선택적 파라미터를 선택하도록 문서 저장 방법을 수정했습니다.

public void SaveDocument(Stream documentToSave, string contentType, string containerName, string url, string friendlyName = null)
{
    var container = GetContainer(containerName);
    container.CreateIfNotExists();
    var blob = container.GetBlockBlobReference(url);
    blob.Properties.ContentType = contentType;
    if (friendlyName != null)
      blob.Properties.ContentDisposition = "attachment; filename=" + friendlyName;
    blob.UploadFromStream(documentToSave);
}

자세한 내용은 http://blog.simontimms.com/2013/12/02/content-disposition-comes-to-azure/ 를 참조해 주세요.

대답은 '아니오'입니다.blob에 content-disposition 헤더를 설정해야 하며 blob 스토리지에서는 해당 헤더를 설정할 수 없습니다.

Content Disposition 속성을 코드와 수동으로 설정해 보았습니다.나한테는 안 통했어내가 몇 가지를 고쳤더니 작동하기 시작했어.이상할 수도 있지만content-disposition양쪽 모두에 파일 이름을 추가할 때까지 응답 헤더가 없습니다.Properties and MetadataBLOB 업로드 중.

NuGet 패키지:WindowsAzure.저장소(버전=9.3.3)
저장소 계정 종류:Storage V2(일반용도 v2)

        var cloudStorageAccount = CloudStorageAccount.Parse(chatStorageConnectionString);
        var cloudBlobClient = cloudStorageAccount.CreateCloudBlobClient();
        string extension = ".jpg";
        string containerName = "foobar";

        var container = cloudBlobClient.GetContainerReference(containerName);

        if(!(await container.ExistsAsync()))
        {
            logger.LogError($"Unable to connect to container {containerName: containerName}");
            return "";
        }

        var imageBlob = container.GetBlockBlobReference(Guid.NewGuid().ToString() + extension);

        // These two lines are what I'm talking about
        imageBlob.Metadata.Add("ContentDisposition", "attachment; filename=\"testfire.jpg\"");
        imageBlob.Properties.ContentDisposition = "attachment; filename=\"testfire.jpg\"";

        await imageBlob.UploadFromStreamAsync(stream);
        if(!await imageBlob.ExistsAsync())
        {
            logger.LogError("Image was not uploaded succesfully.");
            return "";
        }

먼저 blob URI에 사용자 정의 도메인을 사용할 수 있습니다.http://blogs.msdn.com/b/avkashchauhan/archive/2011/03/22/using-custom-domain-name-with-windows-azure-storage-instead-of-windows-stroage-name-blob-core-windows-net.aspx

솔루션 예시...

using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.StorageClient;

StorageCredentialsAccountAndKey credentials = new StorageCredentialsAccountAndKey(ConfigurationManager.AppSettings["WindowsAzureStorageAccountName"], ConfigurationManager.AppSettings["WindowsAzureStorageAccountKey"]);
CloudStorageAccount cloudStorageAccount = new CloudStorageAccount(credentials, true);

CloudBlobContainer blobContainer = blobClient.GetContainerReference("mycontainer");

// e.g. GUID of currently logged in user
string fileName = System.Web.Security.Membership.GetUser().ProviderUserKey.ToString();

CloudBlob blob = blobContainer.GetBlobReference(fileName);

byte[] blobArray = blob.DownloadByteArray();

Response.ContentType = "text/plain";
Response.AddHeader("content-disposition", "attachment; filename=" + "MyText.txt");
Response.BinaryWrite(blobArray);
Response.End();

언급URL : https://stackoverflow.com/questions/7027656/friendly-filename-when-public-download-azure-blob