api控制器的文件下载问题
本文关键字:问题 文件下载 控制器 api | 更新日期: 2023-09-27 18:06:52
public class DefaultController : Controller
{
// GET: Default
public ActionResult Index()
{
return Download();
}
public FileResult Download()
{
string xmlString = "my test xml data";
string fileName = "test" + ".xml";
return File(Encoding.UTF8.GetBytes(xmlString), "application/xml", fileName);
}
}
我有上面的代码在asp.net mvc应用程序下载的文件。它工作得很好,因为我的控制器被继承到controller。但是当我将这段代码移动到Webapi控制器时,它会在return File抛出错误。经过分析,我发现我的控制器在webapi是继承到ApiController(system.web.http)。api控制器)。我发现ApiController中没有File类。是否有在webapi控制器中实现下载文件功能的选项?
我在webapi控制器中尝试了下面的替代代码,但调用后无法看到下载文件。
public HttpResponseMessage DownloadConstructedXmlFile()
{
var result = new HttpResponseMessage(HttpStatusCode.OK);
string xmlContent = "My test xml data";
//var serializer = new XmlSerializer(typeof(xmlContent));
var builder = new StringBuilder();
using (var writer = new StringWriter(builder))
{
// serializer.Serialize(writer, xmlContent);
result.Content = new StringContent(xmlContent, Encoding.UTF8, "application/xml");
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = string.Format("test.xml")
};
// return result;
}
return new HttpResponseMessage();
}
PS:我正在尝试使用angularjs代码通过angular服务调用这个api。这将在单击下载按钮时调用。任何示例angular代码或api控制器代码中的帮助或建议都会有所帮助。
下面是一个更简单的例子:
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Web.Http;
namespace WebApplication1.Controllers
{
public class ValuesController : ApiController
{
// GET: api/Values
public HttpResponseMessage Get()
{
var xmlString = "<xml><name>Some XML</name></xml>";
var result = Request.CreateResponse(HttpStatusCode.OK);
result.Content = new StringContent(xmlString, Encoding.UTF8, "application/xml");
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = "test.xml"
};
return result;
}
}
}
我以为这样做就可以了!
public HttpResponseMessage Get(string fileName)
{
FileStream fileStream = FileProvider.Open(fileName);
var response = new HttpResponseMessage();
response.Content = new StreamContent(fileStream);
response.Content.Headers.ContentDisposition
= new ContentDispositionHeaderValue("attachment");
response.Content.Headers.ContentDisposition.FileName = fileName;
response.Content.Headers.ContentType
= new MediaTypeHeaderValue("application/octet-stream");
response.Content.Headers.ContentLength
= FileProvider.GetLength(fileName);
return response;
}
考虑到您正在返回XML,您可以让控制器返回XDocument。
public XDocument returnXMLFile()
{
var xDoc = XDocument.Load("test.xml");
return xDoc;
}
您将需要修改GlobalConfiguration.Configuration.Formatters
返回XML,或者配置您的客户端将接收头设置为application/xml
var xml = new System.Net.Http.Formatting.XmlMediaTypeFormatter();
xml.MediaTypeMappings.Add(new QueryStringMapping("format", "xml", "application/xml"));
GlobalConfiguration.Configuration.Formatters.Add(xml);
你可以通过超链接
下载xml格式的文件<a href="[pathToController]/returnxmlfile?format=xml" >Download XML</a>
要自定义,可以看看这些关于用Angular js下载文件的问题。
- 从ASP下载文件。. NET Web API方法使用angularjs
- 从angular js的web api下载csv文件