Как загрузить изображение на сервер .NET через api в xamarin?
Привет!
Я пытаюсь загрузить изображение на сервер .net с помощью xamarin, но у меня есть проблема, по-видимому, на стороне клиента.Когда я пытаюсь опубликовать изображение с помощью Postman непосредственно на стороне сервера,все работает отлично, и изображение сохраняется в папке в wwwroot.Однако,когда я выбираю изображение на стороне клиента,я получаю эту ошибку "
System.NullReferenceException: Object reference not set to an instance of an object.
Я использую "пример.Плагин.Media" nuget, который принимает изображение в качестве медиафайла, и я преобразую его в байты, чтобы он хранился в базе данных, так как в модели он объявлен как байтовый массив.Я попытался сделать метод api в веб-сервисе,чтобы взять изображение в качестве медиафайла, но по какой-то причине он выдает ошибку, о которой я упоминал выше.Я предполагаю,что поскольку серверная сторона имеет изображение как IFormFile, и я пытаюсь отправить его как MediaFile, он объявит его как нулевой объект.
Это мой класс моделей:
public class User { public int IdUser { get; set; } public string Name { get; set; } public string Email { get; set; } public string Password { get; set; } public string ConfPassword { get; set; } public DateTime Created { get; set; } = DateTime.Now; public DateTime? Dob { get; set; } public byte[] Picture { get; set; } public virtual ICollection<Login> Login { get; set; } }
Метод api на стороне клиента:
public void UploadPicture(MediaFile image,string fileName) { <pre> HttpContent fileStreamContent = new StreamContent(image.GetStream()); fileStreamContent.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("form-data") { Name = "file", FileName = fileName }; fileStreamContent.Headers.ContentType = new System.Net.Http.Headers.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) { // } }
}
Метод команды ViewModel для получения изображения и преобразования его в байтовый массив:
async Task UploadImage() { await CrossMedia.Current.Initialize(); // await CrossPermissions.Current.RequestPermissionAsync<CameraPermission>(); var mediaOptions = new PickMediaOptions() { PhotoSize = PhotoSize.Medium }; var selectedImageFile = await CrossMedia.Current.PickPhotoAsync(mediaOptions); using (var memoryStream = new MemoryStream()) { selectedImageFile.GetStream().CopyTo(memoryStream); Picture = memoryStream.ToArray(); await service.UploadPictureAsync(selectedImageFile,selectedImageFile.ToString()); } if (selectedImageFile == null) { await Application.Current.MainPage.DisplayAlert("Error", "Could not get file", "ok"); return; } }
Серверный метод, который работает:
[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"); 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); } } }
Есть ли какое-либо обходное решение, которое позволит мне преобразовать медиафайл в IFormFile для отправки его на сервер или как я должен подойти к этому?Любая помощь будет оценена по достоинству!
Что я уже пробовал:
Я попытался настроить метод api для получения медиафайла следующим образом:
public void UploadPicture(MediaFile image) { string pictureUrl = "http://10.0.2.2:5000/api/UploadPicture"; <pre> try { StreamContent content = new StreamContent(image.GetStream()); content.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data") { FileName = "newimage", Name = "image" }; content.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg"); HttpClientHandler clientHandler = new HttpClientHandler(); clientHandler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => { return true; }; var client = new HttpClient(clientHandler); var multi = new MultipartFormDataContent(); multi.Add(content); var result = client.PostAsync(pictureUrl, multi).Result; } catch (Exception e) { }
Поскольку это мой первый раз,когда я работаю с загрузкой файлов, я взял этот метод с форума xamarin, он написан не мной.