2015-08-07 4 views
8
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 для загрузки файла. Он отлично работал, поскольку мой контроллер унаследован контроллеру. Но когда я перемещаю этот код на контроллер Webapi, он выдает ошибку при возврате Файл. После анализа я обнаружил, что мой контроллер в webapi наследует ApiController (контроллер system.web.http.api). Я обнаружил, что в ApiController нет класса File. Есть ли возможность реализовать функцию загрузки файлов в контроллере webapi?Ошибка загрузки файла с помощью контроллера api

Я попробовал следующий альтернативный код в контроллере 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 код для вызова этого апи через угловой service.This вызывается на кнопку загрузки мыши. Любой примерный угловой код или помощь в коде контроллера или предложениях api будут полезны.

+6

http://stackoverflow.com/questions/9541351/returning-binary-file-from-controller-in-asp-net-web-api –

ответ

10

Вот гораздо более простой пример:

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; 
     } 
    } 
    } 
+0

На самом деле у меня нет text.xml. Я получаю данные из db и генерирую xml-файл на лету. Я пытаюсь загрузить этот XML-файл. – Kurkula

+0

Спасибо за редактирование, у меня есть полный xml в виде строки, и я пытаюсь загрузить этот XML-файл. У меня нет xml-файла. – Kurkula

+0

Извините, я пытался обменять на другой компьютер, чтобы изменить это, им нужна черновая функция. – Jonathan

2

Учитывая, что вы возвращаете XML, вы можете вернуть контроллеру XDocument.

public XDocument returnXMLFile() 
{ 
    var xDoc = XDocument.Load("test.xml"); 
    return xDoc; 
} 

Вам будет необходимо либо изменить GlobalConfiguration.Configuration.Formatters вернуть XML или настроить клиента, чтобы установить accept header в 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.

+0

Я пытаюсь получить данные из БД, построить XML и затем загрузите xml-файл в локальную систему, нажав кнопку через угловые js. – Kurkula

+1

@Chandana Возвращаемый тип метода контроллера может быть любым, структура создаст xml для вас. – mikek3332002

+0

Я очень ценю вашу помощь и микрофон времени. Ответ Jonahan работал с моим требованием, но ваш ответ также полезен для многих, кто попадает в подобную ситуацию, как я. – Kurkula

3

Это кажется, что-то подобное будет делать трюк!

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; 
} 
Смежные вопросы