Ошибка на стороне клиента при загрузке изображения на сервер ASP. NET Core - PullRequest
0 голосов
/ 05 августа 2020

Я борюсь с загрузкой изображения со стороны клиента w в папку на стороне сервера. Net Core. Я использовал Postman, чтобы проверить, работает ли метод на стороне сервера, и он работает без каких-либо проблема, но когда я пытаюсь загрузить изображение со стороны клиента, я получаю ошибку на стороне сервера типа NullReferenceException: ссылка на объект не установлена ​​на экземпляр объекта. Это метод Post на стороне сервера. :

 [HttpPost]
    public async Task Post(IFormFile file)
    {
       
        if (string.IsNullOrWhiteSpace(_environment.WebRootPath))
         {
             _environment.WebRootPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot");
         }
 
         var uploads = Path.Combine(_environment.WebRootPath, "uploads");
         //var fileName = file.FileName.Split('\\').LastOrDefault().Split('/').LastOrDefault();
         if (!Directory.Exists(uploads)) Directory.CreateDirectory(uploads);
         if (file.Length > 0)
         {
             using (var fileStream = new FileStream(Path.Combine(uploads, file.FileName), FileMode.Create))
             {
                 await file.CopyToAsync(fileStream);


             }
         }
       
   
    }

Очевидно, метод выброшен там, где я проверяю, больше ли длина файла, чем 0. На стороне клиента я получаю ошибку «500 внутренняя ошибка сервера», и я попытался проверить с помощью отладчик, в котором именно возникает ошибка, но я не могу найти ничего, что могло бы напоминать какую-либо ошибку. Это метод API для клиентской стороны:

  public async Task UploadPictureAsync(MediaFile image)
    {
        User user = new User();
        string pictureUrl = "http://10.0.2.2:5000/api/UploadPicture";
        HttpContent fileStreamContent = new StreamContent(image.GetStream());
    //  user.Picture=GetImageStreamAsBytes(image.GetStream());
        fileStreamContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data") {FileName=Guid.NewGuid() + ".Png",Name="image"};
        fileStreamContent.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
        HttpClientHandler clientHandler = new HttpClientHandler();
        clientHandler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => { return true; };
        using (var client = new HttpClient(clientHandler))
        { 
        using (var formData = new MultipartFormDataContent())
        {
            formData.Add(fileStreamContent);
                var response = await client.PostAsync(pictureUrl, formData);
               if(response.IsSuccessStatusCode)
                {
                    var result = response.Content.ReadAsStringAsync().Result;
                  
                }
            }
        }
    }

Изображение объявлено в модели как байтовый массив:

 public byte[] Picture { get; set; }

Кто-нибудь понимает, почему мой метод POST имеет такое поведение, поскольку серверная сторона работает отлично, но не работает, когда я пытаюсь загрузить рекламировать изображение со стороны клиента? Что я нахожу странным, так это то, что когда я читаю ошибку и смотрю на Content-Type, это "text / plain" вместо "form-data", и я попытался установить его в MutipartFormDataContent вот так:

formData.Headers.ContentType.MediaType = "multipart/form-data"; 

Я также пытался установить MediaTypeHeaderValue на клиенте следующим образом:

 client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/octet-stream"));

Я все еще получаю неправильный тип контента. Я также пробовал другой подход с Stream вместо MediaFile, но безуспешно, так как он даже не достиг точки останова в режиме отладчика для ответа. Любая помощь будет оценена! :)

1 Ответ

1 голос
/ 05 августа 2020

Мне наконец удалось найти ответ !!! Проблема была на стороне клиента, как я подозревал и догадываюсь, что все дело в правильном имени. Оказывается, поскольку на стороне сервера у меня есть IFormFile файл Мне пришлось изменить клиентскую часть, чтобы взять имя параметра "файл" вместо изображение , чтобы он мог работать. Спасибо @Jason за предложения, так как я не понял ошибку с самого начала и провел некоторую отладку на стороне сервера, чтобы помочь мне понять это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...