从WebApi2下载二进制文件作为文件。服务器端

时间:2015-08-04 16:55:31

标签: c# asp.net entity-framework-6 asp.net-web-api2 binaryfiles

我在这里看了几个答案,但仍有问题 一个系统使用Entity Framework 6将二进制byte []保存到SQL 2014中。

我有一个记录的“名称”(不是文件),但我想通过webapi2将二进制数据作为可下载文件提供。我有点工作,但在浏览器上它显示ID作为文件名,并说无法下载文件。它提示下载,但它不能。

现在对于PoC我很难将mime类型编码为word docs。我做错了什么,我应该如何重构它以提供文件名。

我正在使用Office Apps保存文档,任务窗格:

https://msdn.microsoft.com/en-us/library/office/jj715284.aspx

FileType:“ Compressed ”=将Office Open XML(OOXML)格式的整个文档(.pptx或.docx)作为字节数组返回。

[HttpGet, Route("api/activityObjectFile/{id}/{name}")]
        public HttpResponseMessage GetDataFile(int id)
        {
            var fileByte = _activityService.GetFile(id);
            HttpResponseMessage response = new HttpResponseMessage { Content = new StreamContent(new MemoryStream(fileByte))};
            response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/msword");
            response.Content.Headers.ContentLength = fileByte.Length;
            response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment filename=test.docx");

            return response;
        }

然后我尝试让用户下载文件。

WebAPI2控制器:

public Byte[] GetFile(int id)
        {
            var existingActivityObjectFile = _repo.QueryAll<ActivityObject>().Where(a => a.Id == id).Select(a => a.BinaryData).First();

            return existingActivityObjectFile;
        }

班级服务资料库:

<a href="http://stapi.local/api/activityObjectFile/14">Download</a>

客户端网址:

<intbox value="@load(vm.selected.quantity) @save(vm.selected.quantity,before='saveOrder') "/>

1 个答案:

答案 0 :(得分:1)

这应该让你现在开始:

var response = new HttpResponseMessage(HttpStatusCode.OK) 
{ 
   Content = new StreamContent(new MemoryStream(fileByte))        
};
response.Content
        .Headers
        .Add("Content-Type", "application/vnd.openxmlformats-officedocument.wordprocessingml.document");
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") 
{ 
   FileName = "test.docx" 
};
return response;

关于重构的建议,你可以使用我的方法。

我有一个我返回的IHttpActionResult的实现,它看起来像这样:

public class DocumentAttachmentResult : IHttpActionResult {
    private readonly string fileName;
    private readonly string mimeType;
    private readonly byte[] blob;

    public DocumentAttachmentResult(string fileName, string mimeType, byte[] blob) {
        this.fileName = fileName;
        this.mimeType = mimeType;
        this.blob = blob;
    }

    private HttpResponseMessage Execute() {
        var response = new HttpResponseMessage(HttpStatusCode.OK) { Content = new StreamContent(new MemoryStream(this.blob)) };
        response.Content.Headers.Add("Content-Type", this.mimeType);
        response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = this.fileName };
        return response;
    }

    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken) {
        return Task.FromResult(this.Execute());
    }
}

我的控制器动作如下:

    [HttpGet]
    [Route("attachments/{id:guid}/download")]
    public IHttpActionResult DownloadAttachment(Guid id) {
        var attachment = this.repository.FindById(id);
        if (attachment == null) {
            return this.NotFound();
        }
        return new DocumentAttachmentResult(attachment.Name, attachment.FileType.MimeType, attachment.BinaryBlob);
    }

我将文件名,mime类型和二进制文件存储在SQL服务器中,并将其建模为一个名为Attachment的实体。当我使用 WebApi 控制器上的其他操作上传文件时,将捕获mime类型和文件。