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 Metadata
BLOB 업로드 중.
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
'source' 카테고리의 다른 글
WPF: 캔버스 마우스 이벤트가 빈 공간에서 실행되지 않음 (0) | 2023.04.20 |
---|---|
배치 파일의 새 회선을 에코하려면 어떻게 해야 합니까? (0) | 2023.04.20 |
반응성UI 실가동 준비 완료? (0) | 2023.04.20 |
특정 파일을 저장하려면 어떻게 해야 하나요? (0) | 2023.04.20 |
Excel의 케이스 기능 등가 (0) | 2023.04.20 |