Как загружать изображения после обрезки в Xamarin

#xamarin #crop #image-upload

Вопрос:

Я использую ImageCropper и MediaPlugin загружаю изображения. Однако у меня возникли проблемы с получением изображения после обрезки изображения.

 string imagefile; protected void OnClickedRectangle(object sender, EventArgs e) {  new ImageCropper()  {  Success = (imageFile) =gt;  {  Device.BeginInvokeOnMainThread(() =gt;  {  view_imageavatar.Source = ImageSource.FromFile(imageFile);   });  }  }.Show(this); }  async void edit_avatar_Tapped(object sender, EventArgs e) {  try  {  await CrossMedia.Current.Initialize();  new ImageCropper()  {  PageTitle = "Title",  AspectRatioX = 1,  AspectRatioY = 1,  CropShape = ImageCropper.CropShapeType.Rectangle,  SelectSourceTitle = "Img",  TakePhotoTitle = "Take Camera",  PhotoLibraryTitle = "Img Gallery",  Success = (imageFile) =gt;  {  Device.BeginInvokeOnMainThread(async() =gt;  {  view_imageavatar.Source = ImageSource.FromFile(imageFile);  imagefile = imageFile;  //API Get Images Upload  var content = new MultipartFormDataContent();  content.Add(new StreamContent(imageFile), "files", imagefile);  var httpClient = new HttpClient();  var responses = await httpClient.PostAsync("https://xxxxx/api/Upload", content);  });  }  }.Show(this);  }  catch (Exception ex)  {  System.Diagnostics.Debug.WriteLine("GalleryException:gt;"   ex);  } }  

введите описание изображения здесь

Однако как я могу загрузить изображение. обратите внимание, что view_imageavatar изображение по-прежнему отображается после обрезки. Ткс!

Обновить…

 async void edit_avatar_Tapped(object sender, EventArgs e) {  try  {  await CrossMedia.Current.Initialize();  new ImageCropper()  {  PageTitle = "Title",  AspectRatioX = 1,  AspectRatioY = 1,  CropShape = ImageCropper.CropShapeType.Rectangle,  SelectSourceTitle = "Img",  TakePhotoTitle = "Take Camera",  PhotoLibraryTitle = "Img Gallery",  Success = (imageFile) =gt;  {  Device.BeginInvokeOnMainThread(async() =gt;  {  view_imageavatar.Source = ImageSource.FromFile(imageFile);  imagefile = imageFile;  //API Get Images Upload    var fileStream = File.OpenRead(imageFile);  var fileContent = new StreamContent(fileStream);   var content = new MultipartFormDataContent();  content.Add(fileContent, "files", imageFile);  var httpClient = new HttpClient();     var responses = await httpClient.PostAsync("https://xxxxxx/api/UploadAvatarUs", content);   });  }  }.Show(this);  }  catch (Exception ex)  {  System.Diagnostics.Debug.WriteLine("GalleryException:gt;"   ex);  } }  

It still doesn’t work?

Update 2

 async void edit_avatar_Tapped(object sender, EventArgs e) {  try  {  await CrossMedia.Current.Initialize();  new ImageCropper()  {  PageTitle = "Title",  AspectRatioX = 1,  AspectRatioY = 1,  CropShape = ImageCropper.CropShapeType.Rectangle,  SelectSourceTitle = "Img",  TakePhotoTitle = "Take Camera",  PhotoLibraryTitle = "Img Gallery",  Success = (imageFile) =gt;  {  Device.BeginInvokeOnMainThread(async() =gt;  {  view_imageavatar.Source = ImageSource.FromFile(imageFile);  imagefile = imageFile;  //API Get Images Upload   var upfilebytes = File.ReadAllBytes(imageFile);  var ms = new MemoryStream(upfilebytes);  var content = new MultipartFormDataContent();  content.Add(new StreamContent(ms), "files", imageFile);    var httpClient = new HttpClient();    var responses = await httpClient.PostAsync("https://xxxxxx/api/UploadAvatarUs", content);   });  }  }.Show(this);  }  catch (Exception ex)  {  System.Diagnostics.Debug.WriteLine("GalleryException:gt;"   ex);  } }  

-gt; gt;Он все еще не может загружать фотографии через API?

Однако я стараюсь не использовать ImageCropper. Я загружаю напрямую.

 async void edit_avatar_Tapped(object sender, EventArgs e) {  var file = await MediaPicker.PickPhotoAsync();  var content = new MultipartFormDataContent();  content.Add(new StreamContent(await file.OpenReadAsync()), "files", file.FileName);   var httpClient = new HttpClient();   var responses = await httpClient.PostAsync("https://xxxxxx/api/UploadAvatarUs", content);  string a = responses.StatusCode.ToString(); }  

—gt; gt;Тогда все работает нормально, изображение загружается через API

Загружается ли изображение с content.Add(new StreamContent(ms), "files", imageFile); него, не работает ли оно с API? Ищу решения у всех.

Комментарии:

1. Вы можете попробовать создать поток памяти, такой как {var upfilebytes = Файл. ReadAllBytes(файл изображения); var ms = новый поток памяти(upfilebytes); содержимое. Добавить(новый StreamContent(ms), «файлы», файл изображения);}

2. Спасибо, но для меня это все равно не работает. Я обновил вышесказанное в обновлении 2 . Вы можете попробовать это.

3. Я нахожу, в чем проблема. В вашем коде файл изображения-это просто объект(или строка), а не файл, когда вы используете вырезку изображений. Поэтому, когда вы попытаетесь преобразовать его в поток, необходимый для содержимого, вы потерпите неудачу, и поток не будет содержать изображение. Если вы хотите опубликовать изображение после обрезки, вы можете сохранить его на устройстве и опубликовать по его пути.

4. Спасибо, я попробую это сделать

Ответ №1:

Вы действительно проверили, что StreamContent принимает в качестве аргументов?

Для этого требуется Stream не путь к файлу.

Сначала вам нужно открыть файл вот так:

 using var fileStream = File.Open(imageFile); using var fileContent = new StreamContent(fileStream);  

Вы пробовали что-то подобное?

Комментарии:

1. Спасибо. Однако File.Open(imageFile); -gt; gt; Open не работает. Я прохожу внутрь File.OpenRead(imageFile) . Это хорошо? Я обновил вышесказанное.