【发布时间】:2015-08-04 16:55:30
【问题描述】:
我在这里查看了几个答案,但仍有问题。
一个系统正在使用 Entity Framework 6 将二进制字节 [] 保存到 SQL 2014 中。
我有一个记录的“名称”(不是文件),但我想通过 webapi2 将二进制数据作为可下载文件提供。我让它有点工作,但在浏览器上它显示 ID 作为文件名并说无法下载文件。它正在提示下载,但它不能。
现在对于 PoC,我正在将 mime 类型硬编码为 word docs。我做错了什么,我应该如何重构它以提供文件名。
我正在使用 Office 应用程序的任务窗格保存文档:
https://msdn.microsoft.com/en-us/library/office/jj715284.aspx
FileType: "Compressed" = 以字节数组的形式返回 Office Open XML (OOXML) 格式的整个文档(.pptx 或 .docx)。
Office.context.document.getSelectedDataAsync(Office.CoercionType.Text,
function (result) {
if (result.status === Office.AsyncResultStatus.Succeeded) {
vm.data.data = result.value;
//I call a angularJs service which post..
//return $http.post('https://stapi.local:8443/api/activities', vm.data);
} else {
}
}
);
然后我尝试让用户使用以下内容下载文档。
WebAPI2 控制器:
[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;
}
类服务库:
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>
【问题讨论】:
-
使用上述客户端 URL,文件将始终使用您的最终 URL 段的名称。出于测试目的,您可以尝试在
/activityObjectFile/14之后添加任意文件名,例如:activityObjectFile/14/test.docx。您的 WebAPI2 控制器似乎已将路由设置为接受文件名作为路由的一部分,但您似乎并未使用它。
标签: c# asp.net entity-framework-6 asp.net-web-api2 binaryfiles