Xamarin使用ImageCropper裁剪图片后无法通过API上传问题求解
你上传失败的核心原因是MultipartFormDataContent添加文件时,第三个参数直接传入了ImageCropper返回的完整文件路径而非纯文件名,后端API无法识别带路径分隔符的文件名参数;其次可能存在流未正确配置Content-Type、资源未正确释放的问题。
修正方案
- 从ImageCropper返回的完整路径中提取纯文件名,使用
Path.GetFileName()方法处理 - 给文件流内容正确设置
Content-Type请求头 - 用
using语句包裹非托管资源,避免内存泄漏和文件锁问题
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) => { Device.BeginInvokeOnMainThread(async() => { view_imageavatar.Source = ImageSource.FromFile(imageFile); imagefile = imageFile; // 提取纯文件名,不要传完整路径 var fileName = Path.GetFileName(imageFile); // 用using管理流资源,避免文件被占用 using var fileStream = File.OpenRead(imageFile); using var fileContent = new StreamContent(fileStream); // 配置文件的Content-Type,和后端要求匹配即可 fileContent.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("image/jpeg"); using var content = new MultipartFormDataContent(); content.Add(fileContent, "files", fileName); using var httpClient = new HttpClient(); var responses = await httpClient.PostAsync("https://xxxxxx/api/UploadAvatarUs", content); // 可打印响应内容排查后端返回的错误信息 var responseMsg = await responses.Content.ReadAsStringAsync(); System.Diagnostics.Debug.WriteLine("上传接口响应:" + responseMsg); }); } }.Show(this); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine("GalleryException:>" + ex); } }
如果你的后端支持png等其他格式的图片,根据文件扩展名动态修改Content-Type即可。
内容的提问来源于stack exchange,提问作者Chim Di Tru
相关产品推荐
相关产品推荐

