Я борюсь с загрузкой изображения со стороны клиента 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, но безуспешно, так как он даже не достиг точки останова в режиме отладчика для ответа. Любая помощь будет оценена! :)