Для загрузки файла на сервер в качестве параметра POST требуется объект IFileForm. - PullRequest
0 голосов
/ 24 октября 2018

Во-первых, позвольте мне сказать, что у меня нет такого опыта работы с сетями.

Мне нужно загрузить файл на сервер, и в документации Swagger говорится, что для этого требуется POST с несколькими параметрами:

File : object
UserName : string

Также на странице документов Swagger она предоставляет Модель

IFormFile {
   contentType string
   contentDisposition string
   headers { <*>: [string] }
   length integer($int64)
   name string
   fileName string
}

. Я создаю приложение Xamarin.Forms (UWP и iOS) и обратите внимание на определения IFormFile и FormFile вПространство имен AspNetCore, и у меня, похоже, нет доступа к нему.

Итак, я создал поддельный класс FormFile

public class FormFile
{
    public string contentType { get; set; }
    public string contentDisposition { get; set; }
    public List<string> headers { get; set; }
    public long length { get; set; }
    public string name { get; set; }
    public string fileName { get; set; }
}

Я пытаюсь загрузить с помощью:

public async Task UploadFile1(string filePath, string userName, string authToken)
{
    var fileInfo = new FileInfo(filePath);
    var fileName = fileInfo.Name;

    var formFile = new FormFile
    {
        contentType = "multipart/form-data",
        contentDisposition = "form-data",
        headers = new List<string>(),
        length = fileInfo.Length,
        name = "files",
        fileName = fileName
    };

    using (var client = new HttpClient())
    {
        client.MaxResponseContentBufferSize = 256000;
        client.BaseAddress = new Uri("https://my.url/");
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("multipart/form-data"));
        client.DefaultRequestHeaders.Add("x-auth-token", authToken);
        using (var content = new MultipartFormDataContent("---upload"))
        {
            content.Add(new FormUrlEncodedContent(new []
            {
                new KeyValuePair<string, string>("File", JsonConvert.SerializeObject(formFile)),
                new KeyValuePair<string, string>("UserName", userName),
            }));
            content.Headers.ContentType.MediaType = "multipart/form-data";
            var fileStream = File.OpenRead(filePath);
            content.Add(new StreamContent(fileStream), fileName, fileName);
            using (var response = await client.PostAsync("api/datasets", content))
            {
                string received;
                if (response.IsSuccessStatusCode)
                {
                    received = await response.Content.ReadAsStringAsync();
                }
                else
                {
                    received = response.ToString();
                }
            }
        }
    }
}

Я получаю ответ:

StatusCode: 422, ReasonPhrase: 'Unprocessable Entity', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:
{
  Server: Kestrel
  Date: Wed, 24 Oct 2018 14:27:10 GMT
  X-Powered-By: ASP.NET
  Access-Control-Allow-Origin: *
  Content-Length: 0
}

Я совершенно не знаю, как выполнить загрузку на этот сервер.

1 Ответ

0 голосов
/ 24 октября 2018

IFormData - это способ обработки «нормальной» загрузки файла.Поэтому я думаю, вам следует

  • удалить свой класс FormFile, не отправлять ничего в кодировке json.
  • Выполнить «нормальную» загрузку файла => отправить содержимое файла как «Файл»

как-то так

content.Add(new StreamContent(new MemoryStream(image)), "File", "upload.jpg");

От: C # HttpClient 4.5 загрузка нескольких частей / данных формы

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

...