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控制器代码中的帮助或建议都会有所帮助。

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

配置服务器返回XML而不是JSON的一种方法是:
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文件