2015-06-03 4 views
5

Как отправить httppostedfile на webapi? В основном я хочу, чтобы пользователь выбирал файл excel, и я хочу опубликовать его на своем веб-сайте.как отправить httppostedfile на webapi

Gui изготовлен из классического asp.net, а webapi выполнен с использованием нового apicontroller.

Я уже делал некоторое кодирование api, но затем использовал JSON и, похоже, не очень хорошо работал с этим видом объекта.

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

+0

Возможный дубликат: http://stackoverflow.com/questions/12697310/web-api-model-binder-doesnt-work-with-httppostedfilebase – BenjaminPaul

ответ

1

Я решил эту проблему, делая это: В мой контроллер:

using (var client = new HttpClient()) 
      using (var content = new MultipartFormDataContent()) 
      { 
       client.BaseAddress = new Uri(System.Configuration.ConfigurationManager.AppSettings["PAM_WebApi"]); 
       var fileContent = new ByteArrayContent(excelBytes); 
       fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") 
       { 
        FileName = fileName 
       }; 
       content.Add(fileContent); 
       var result = client.PostAsync("api/Product", content).Result; 
      } 

А вот мой ApiController:

[RoutePrefix("api/Product")] 
public class ProductController : ApiController 
{ 
    public async Task<List<string>> PostAsync() 
    { 
     if (Request.Content.IsMimeMultipartContent()) 
     { 
      string uploadPath = HttpContext.Current.Server.MapPath("~/uploads"); 
      if (!System.IO.Directory.Exists(uploadPath)) 
      { 
       System.IO.Directory.CreateDirectory(uploadPath); 
      } 
      MyStreamProvider streamProvider = new MyStreamProvider(uploadPath); 

      await Request.Content.ReadAsMultipartAsync(streamProvider); 

      List<string> messages = new List<string>(); 
      foreach (var file in streamProvider.FileData) 
      { 
       FileInfo fi = new FileInfo(file.LocalFileName); 
       messages.Add("File uploaded as " + fi.FullName + " (" + fi.Length + " bytes)"); 
      } 

      return messages; 
     } 
     else 
     { 
      HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.BadRequest, "Invalid Request!"); 
      throw new HttpResponseException(response); 
     } 
    } 
} 

    public class MyStreamProvider : MultipartFormDataStreamProvider 
    { 
     public MyStreamProvider(string uploadPath) 
      : base(uploadPath) 
     { 

     } 

public override string GetLocalFileName(HttpContentHeaders headers) 
{ 
    string fileName = headers.ContentDisposition.FileName; 
    if (string.IsNullOrWhiteSpace(fileName)) 
    { 
     fileName = Guid.NewGuid().ToString() + ".xls"; 
    } 
    return fileName.Replace("\"", string.Empty); 
} 
} 

Я нашел этот код в учебнике так что я не один для кредитования. Итак, я пишу файл в папку. И из-за mysreamprovider я могу получить то же имя файла, что и файл, который я впервые добавил в графический интерфейс. Я также добавляю конец файла .xls в файл, потому что моя программа будет обрабатывать только файлы excel. Поэтому я добавил некоторую проверку на ввод в моем графическом интерфейсе, чтобы я знал, что добавленный файл является файлом excel.