C# 如何从web api控制器返回文件?
我正在使用MVC 5 web Api控制器,我想返回一个文件:C# 如何从web api控制器返回文件?,c#,json,asp.net-mvc,asp.net-web-api,C#,Json,Asp.net Mvc,Asp.net Web Api,我正在使用MVC 5 web Api控制器,我想返回一个文件: [Route("")] public HttpResponseMessage GetFile() { var statusCode = HttpStatusCode.OK; FileStream file = XLGeneration.XLGeneration.getXLFileExigence(); return Request.CreateResponse(statusCode, file); } 它
[Route("")]
public HttpResponseMessage GetFile()
{
var statusCode = HttpStatusCode.OK;
FileStream file = XLGeneration.XLGeneration.getXLFileExigence();
return Request.CreateResponse(statusCode, file);
}
它不起作用
邮递员的例外情况是:
“ExceptionMessage”:“ObjectContent'1'类型未能序列化内容类型'application/json;charset=utf-8'的响应正文。”
试试这个
[Route("")]
public HttpResponseMessage GetFile()
{
var result = new HttpResponseMessage(HttpStatusCode.OK);
try
{
var file = XLGeneration.XLGeneration.getXLFileExigence();
result.Content = new StreamContent(file);
result.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream");
var value = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment");
value.FileName = "Whatever your filename is";
result.Content.Headers.ContentDisposition = value;
}
catch (Exception ex)
{
// log your exception details here
result = new HttpResponseMessage(HttpStatusCode.InternalServerError);
}
return result;
}
这实际上应该将其作为一个文件流回。只是一个想法:
public HttpResponseMessage GetFile()
{
FileStream file = XLGeneration.XLGeneration.getXLFileExigence();
using(var sr = new StreamReader(file))
{
content = sr.ReadToEnd();
return new HttpResponseMessage
{
Content = new StringContent(content, Encoding.UTF8, "application/json")
};
}
}
我正在发布对我有用的东西,以防其他人遇到麻烦
[ActionName("File")]
[HttpGet]
public HttpResponseMessage File()
{
var response = new HttpResponseMessage(HttpStatusCode.OK);
var stream = new System.IO.FileStream(yourFilePath, System.IO.FileMode.Open);
response.Content = new StreamContent(stream);
response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream");
return response;
}
我从WebAPI控制器返回字节[],并成功下载PDF。 我正在使用iTextSharp(LGPL)4.1.6免费PDF转换器。 要安装iTextSharp(LGPL/MPL),请在PackageManager控制台中运行以下命令 安装软件包iTextSharp LGPL-版本4.1.6 服务器端代码
[Route("Export/ExportToPdf")]
public byte[] ExportToPdf(string html)
{
MemoryStream msOutput = new MemoryStream();
TextReader reader = new StringReader(html);
Document document = new Document(new Rectangle(842, 595));
PdfWriter writer = PdfWriter.GetInstance(document, msOutput);
document.Open();
document.HtmlStyleClass = @"<style>*{ font-size: 8pt; font-family:arial;}</style>";
var parsedHtmlElements = HTMLWorker.ParseToList(new StringReader(html), null);
foreach (var htmlElement in parsedHtmlElements)
{
document.Add(htmlElement as IElement);
}
document.Close();
return msOutput.ToArray();
}
[路由(“导出/导出TopDF”)]
公共字节[]ExportToPdf(字符串html)
{
MemoryStream msOutput=新的MemoryStream();
TextReader=新的StringReader(html);
文档=新文档(新矩形(842595));
PdfWriter writer=PdfWriter.GetInstance(文档,msOutput);
document.Open();
document.HtmlStyleClass=@“*{font size:8pt;font-family:arial;}”;
var parsedhtmlements=HTMLWorker.ParseToList(新的StringReader(html),null);
foreach(parsedhtmlements中的var htmlElement)
{
文件。添加(htmlElement作为IEElement);
}
document.Close();
返回msOutput.ToArray();
}
客户端代码
//Call this function inside of AJAX success.
function ExportToPDF(data) {
//base64 To ArrayBuffer
var binaryString = window.atob(data);
var binaryLen = binaryString.length;
var bytes = new Uint8Array(binaryLen);
for (var i = 0; i < binaryLen; i++) {
var ascii = binaryString.charCodeAt(i);
bytes[i] = ascii;
}
//-------
var link = document.createElement('a');
link.href = window.URL.createObjectURL(new Blob([bytes], { type: 'application/pdf' }));
link.download = "Report.pdf";
link.click();
}
//在AJAX success中调用此函数。
函数ExportToPDF(数据){
//base64到ArrayBuffer
var binaryString=window.atob(数据);
var binaryLen=binaryString.length;
var bytes=新的Uint8Array(二进制数);
对于(var i=0;i
查看方法的定义,第二个参数是您试图序列化的值。所以它试图做的是序列化一个文件流
,这可能是不可序列化的。尝试将文件读入一个字符串,并使用该字符串作为第二个参数。可能相关:@AtefB我已经让此代码在生产环境中运行了将近一年,唯一的区别是我将文件内容读入一个字节数组,并创建一个MemoryStream来创建StreamContent。除此之外,它是从我的生产代码中剪切和粘贴的。@AtefB有两种可能的原因,这可能不适用于您。如果您的XLGeneration.XLGeneration.getxlFileExicience()实际上没有返回流,或者如果您没有用实际的文件名替换“无论您的文件名是什么”,则它只返回文件名,而不返回文件的流file@AtefB如果我知道我的代码给你的特殊情况,我会知道更多关于什么地方出错的信息。您发布的原始代码的问题是WebAPI使用Newtonsoft的JSON.Net作为默认序列化程序。因此,当您向它传递文件流时,它不知道如何处理它。我的代码绕过了使用默认序列化程序的过程。@AtefB请验证您的XLGeneration.XLGeneration.getxlFileExicience()方法返回的是一个流,并且其长度大于0。听起来除了可能是一个空流之外,你没有从这个方法中得到任何东西。这会在发送之前将整个文件加载到内存中@Kevin的解决方案更可取,因为它直接将流发送到客户端。@Miroslav Exception@“使用(var sr=new StreamReader(file))”无法播放流