我在这里看了几个答案,但仍有问题 一个系统使用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') "/>
答案 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类型和文件。