Подтвердить что ты не робот

WebApi: как обращаться с изображениями

Я разворачиваю свое первое приложение WebApi, и у меня есть 2 вопроса о том, как обращаться с изображениями.

1) Каковы различные способы загрузки POST/GET на мой сервис? Я думаю, что я могу использовать текст Base-64 в JSON или оставаться родным как двоичный. Я понимаю, что, преобразуя изображение в текст, значительно увеличивается размер пакета.

2) Если я отправлю изображение (из веб-формы, из собственного клиента, из другой службы), должен ли я добавить Image Controller/Handler или использовать Formatter? Это даже вопрос или вопрос?

Я исследовал StackOverflow и Google и придумал много примеров:

Изображение к службе (POST) Контроллер:
http://www.asp.net/web-api/overview/working-with-http/sending-html-form-data,-part-2 http://code.msdn.microsoft.com/Uploading-large-files-386ec0af#content

Formatter: http://jflood.net/tag/mediatypeformatter/

Изображение из службы (GET) контроллер: http://www.dotnetcurry.com/ShowArticle.aspx?ID=856 ASP.NET Web API загружает изображения в виде двоичных файлов http://www.strathweb.com/2013/01/asynchronously-streaming-video-with-asp-net-web-api/Formatter:
http://www.asp.net/web-api/overview/formats-and-model-binding/media-formatters

Изображение И ОТ контроллер: http://www.codeguru.com/csharp/.net/returning-images-from-asp.net-web-api.htm

Formatter: http://byterot.blogspot.com/2012/04/aspnet-web-api-series-part-5.html

Я не уверен, в каком направлении я должен идти. Является ли статья сайта/блога, в которой изложены плюсы и минусы? И я даже не смотрел WebApi V2, чтобы узнать, есть ли у этого другой способ подумать об этом.

Заранее спасибо

4b9b3361

Ответ 2

Для сохранения цели - вот схема того, что сказал блог Джейми:

Используйте контроллер:

Get:

public HttpResponseMessage Get(int id)
{
    var result = new HttpResponseMessage(HttpStatusCode.OK);
    String filePath = HostingEnvironment.MapPath("~/Images/HT.jpg");
    FileStream fileStream = new FileStream(filePath, FileMode.Open);
    Image image = Image.FromStream(fileStream);
    MemoryStream memoryStream = new MemoryStream();
    image.Save(memoryStream, ImageFormat.Jpeg);
    result.Content = new ByteArrayContent(memoryStream.ToArray());
    result.Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg");

    return result;
}

Удалить

public void Delete(int id)
{
    String filePath = HostingEnvironment.MapPath("~/Images/HT.jpg");
    File.Delete(filePath);
}

Сообщение:

public HttpResponseMessage Post()
{
    var result = new HttpResponseMessage(HttpStatusCode.OK);
    if (Request.Content.IsMimeMultipartContent())
    {
        //For larger files, this might need to be added:
        //Request.Content.LoadIntoBufferAsync().Wait();
        Request.Content.ReadAsMultipartAsync<MultipartMemoryStreamProvider>(
                new MultipartMemoryStreamProvider()).ContinueWith((task) =>
        {
            MultipartMemoryStreamProvider provider = task.Result;
            foreach (HttpContent content in provider.Contents)
            {
                Stream stream = content.ReadAsStreamAsync().Result;
                Image image = Image.FromStream(stream);
                var testName = content.Headers.ContentDisposition.Name;
                String filePath = HostingEnvironment.MapPath("~/Images/");
                //Note that the ID is pushed to the request header,
                //not the content header:
                String[] headerValues = (String[])Request.Headers.GetValues("UniqueId");
                String fileName = headerValues[0] + ".jpg";
                String fullPath = Path.Combine(filePath, fileName);
                image.Save(fullPath);
            }
        });
        return result;
    }
    else
    {
        throw new HttpResponseException(Request.CreateResponse(
                HttpStatusCode.NotAcceptable,
                "This request is not properly formatted"));
    } 
}