#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)
. Это хорошо? Я обновил вышесказанное.