Как отправить файл через самостоятельный веб-API и обработать его на сервере?

У меня есть собственный веб-API с использованием Owin и Katana. Я хотел бы отправить файлы (могут быть довольно большими, несколько сотен МБ) из примера клиента и сохранить эти файлы на диске сервера. В настоящее время просто тестирую сервер на моей локальной машине.

У меня есть следующее на машине тестового клиента (здесь написано изображение, но это не всегда будет изображение):

using System;
using System.IO;
using System.Net.Http;

class Program
{
    string port = "1234";
    string fileName = "whatever file I choose will be here";

    static void Main(string[] args)
    {
        string baseAddress = "http://localhost:" + port;
        InitiateClient(baseAddress);
    }

    static void InitiateClient(string serverBase)
    {
        Uri serverUri = new Uri(serverBase);
        using(HttpClient client = new HttpClient())
        {
            client.BaseAddress = serverUri;
            HttpResponseMessage response = SendImage(client, fileName);
            Console.WriteLine(response);
            Console.ReadLine();
        }
    }

    private static HttpResponseMessage SendImage(HttpClient client, string imageName)
    {
        using (var content = new MultipartFormDataContent())
        {
            byte[] imageBytes = System.IO.File.ReadAllBytes(imageName);
            content.Add(new StreamContent(new MemoryStream(imageBytes)), "File", "samplepic.png");
            client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("multipart/form-data"));
            return client.PostAsync("api/ServiceA", content).Result;
        }

    }

Во-первых, это правильный способ отправки файла с помощью POST?

И вот тут я действительно потерялся. Я не знаю, как сохранить файл, который я получаю в методе Post моего ServiceAController, который наследует ApiController. Я видел несколько других примеров, в которых использовался HttpContext.Current, но, поскольку он размещен самостоятельно, он кажется нулевым.


person D. King    schedule 12.08.2015    source источник


Ответы (2)


Я бы разбил файлы на куски перед загрузкой. 100 Мб — это многовато для одного HTTP POST-запроса. Большинство веб-серверов также имеют определенные ограничения на размер HTTP-запроса.

Используя фрагменты, вам не нужно будет повторно отправлять все данные, если время ожидания соединения истекло.

person Maksym Kozlenko    schedule 12.08.2015
comment
Хм, я вижу. Я это сделаю. Как мне на самом деле получить данные в методе Post вебапи? Я не уверен, как я могу получить файл (или части файла), который был отправлен - person D. King; 12.08.2015

Не имеет значения, используете ли вы собственный хостинг или IIS, и является ли это файлом изображения или файлом любого типа.

Вы можете проверить мой ответ, который даст вам простой код для этого.

https://stackoverflow.com/a/10765972/71924

Что касается размера, то, безусловно, лучше использовать фрагменты, если это возможно, но это дает больше работы для ваших клиентов (если вы также не владеете клиентским кодом API) и для вас на сервере, поскольку вы должны перестроить файл.

Это будет зависеть от того, будут ли все файлы иметь размер более 100 МБ или только несколько. Если они постоянно велики, я бы посоветовал искать поддержку диапазона байтов http. Это часть стандарта http, и я уверен, что вы можете найти кого-нибудь, кто реализовал его с помощью WebAPI.

person Julien Jacobs    schedule 12.08.2015