3

シナリオは、送信時にテンプレートで差し込み印刷を実行し、Word ドキュメントを作成してから Azure BLOB ストレージに保存するフォームを持っていることです。

私の問題は、ユーザーが Web Api 2 とカスタム IHttpActionResult を使用してこのファイルをダウンロードできるようにしたいということです

public class FileActionResult : IHttpActionResult
{
    private readonly HttpRequestMessage _request;
    private readonly StreamContent _content;
    private readonly MediaTypeHeaderValue _contentType;
    private readonly long? _contentLength;
    private readonly ContentDispositionHeaderValue _contentDisposition;

    public FileActionResult(HttpRequestMessage request, StreamContent content, MediaTypeHeaderValue contentType, 
        long? contentLength, 
        ContentDispositionHeaderValue contentDisposition)
    {
        _request = request;
        _content = content;
        _contentType = contentType;
        _contentLength = contentLength;
        _contentDisposition = contentDisposition;
    }


    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {
        var response = _request.CreateResponse(HttpStatusCode.Accepted);
        response.Content = _content;
        response.Content.Headers.ContentLength = _contentLength;
        response.Content.Headers.ContentType = _contentType;
        response.Headers.CacheControl = new CacheControlHeaderValue();
        response.Content.Headers.ContentDisposition = _contentDisposition;

        return Task.FromResult(response);
    }
}

次に、私の Api コントローラーには、ファイルを取得するための GetFile メソッドがあります。

[OverrideAuthentication]
    [AllowAnonymous]
    [HttpGet("GetFile")]
    public async Task<IHttpActionResult> GetFile(string fileName)
    {
        var storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageAccountConnectionString"));
        var blobClient = storageAccount.CreateCloudBlobClient();
        var container = blobClient.GetContainerReference("MoveInn");
        var blob = await container.GetBlobReferenceFromServerAsync(@"http://xxxxxxxx.blob.core.windows.net/xxxxx/" + fileName);
        var blobExists = await blob.ExistsAsync();
        if (!blobExists)
        {
            return BadRequest("Not Found.");
        }


        var blobStream = await blob.OpenReadAsync();

        var result = new FileActionResult(Request,
            new StreamContent(blobStream),
            new MediaTypeHeaderValue(blob.Properties.ContentType), 
            blob.Properties.Length,
            new ContentDispositionHeaderValue("attachment"){
                FileName = fileName.Split('.')[1],
                Size = blob.Properties.Length
            });

        return result;
    }

これはクロムで完全に機能するようですが、IE10/11 でファイルをダウンロードしようとすると問題が発生します。ファイルを開くか保存するかを尋ねるダイアログが表示されますが、ドキュメントのファイル名は Get Path 全体、つまり GetFile?fileName=xxxxxxxxxxxxxxx.docx です。

その後、このファイルを保存しようとすると、保存できません。

どんな支援も素晴らしいでしょう!

4

0 に答える 0