我正在使用一个名为ImageCropper.Forms的图像裁剪器库,当我从图库中选择完图像时,它将对其进行裁剪并将其附加到Image
上。
因此,我尝试访问图像源以将其用于上传,但是出现此错误。
实际上,该库中还有一个名为Xam.Plugin.Media的库,该库可帮助从图库中选择图像或使用相机拍照。
System.IO.DirectoryNotFoundException:无法找到 路径“ /文件: /data/user/0/com.nl.via/cache/cropped5748405962114920444.jpg”。 在System.IO.FileStream..ctor(System.String路径,System.IO.FileMode模式,System.IO.FileAccess访问, System.IO.FileShare共享,System.Int32缓冲区大小,System.Boolean 匿名,System.IO.FileOptions选项)[0x001 ...
我认为它可以选择Image/ picture
路径,但是它不起作用,出了什么问题。
这是我获取裁剪后的图片并将其附加到Image
上的方式:
private void SelectImageFromGallery(object sender, EventArgs e)
{
var path = "";
new ImageCropper
{
CropShape = ImageCropper.CropShapeType.Rectangle,
Success = imageFile =>
{
Device.BeginInvokeOnMainThread(() =>
{
//profile_img.Source = ImageSource.FromStream(() => { return _mediaFile.GetStream(); });
profile_img.Source = ImageSource.FromFile(imageFile);
Debug.WriteLine("filepath2 " + path);
});
}
}.Show(this);
Debug.WriteLine("filepath " + path);
}
然后在附加选择之后,我将选择上传到服务器:
private async void UploadImage(){
try
{
ai.IsRunning = true;
ai.IsVisible = true;
var token = Application.Current.Properties["token"].ToString();
var multiForm = new MultipartFormDataContent();
string documentsPath = System.Environment.GetFolderPath (System.Environment.SpecialFolder.Personal);
Console.WriteLine("filepath2--:" + profile_img.Source);
// Convert it into bytes.
var readAllBytes = File.ReadAllBytes(profile_img.Source.ToString());
var baContent = new ByteArrayContent(readAllBytes);
multiForm.Add(new StringContent(XValue.ToString()), X);
multiForm.Add(new StringContent(YValue.ToString()), Y);
multiForm.Add(new StringContent("60"), Width);
multiForm.Add(new StringContent("60"), Height);
multiForm.Add(baContent, "image", Path.GetFileName(_mediaFile.AlbumPath));
var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
var response = await client.PostAsync(Settings.BaseUrl + "/auth/Users/ChangeAvatar", multiForm);
}
因此,如果您清楚地看到上传部分,则此行会发生错误:
// Convert it into bytes.
var readAllBytes = File.ReadAllBytes(profile_img.Source.ToString());
所以想知道上传裁剪后的图像的最佳方法是什么吗?
编辑:
使用设备文件资源管理器时,我看到一个没有user/0/
的路径,下面是一个Image,路径是data/com.nl.via/cache/cropped1030309698891957373.jpg
:
但是打印的是data/user/0/com.nl.via/cache/cropped1030309698891957373.jpg
。
答案 0 :(得分:1)
尝试将文件存储到应用的本地存储中
var path = "";
new ImageCropper
{
CropShape = ImageCropper.CropShapeType.Rectangle,
Success = imageFile =>
{
Device.BeginInvokeOnMainThread(() =>
{
//profile_img.Source = ImageSource.FromStream(() => { return _mediaFile.GetStream(); });
profile_img.Source = ImageSource.FromFile(imageFile);
Debug.WriteLine("filepath2 " + path);
var folderPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
File.Copy(imageFile, Path.Combine(folderPath, "image.png"));
});
}
}.Show(this);
然后使用此本地路径读取文件:
var folderPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
// Keep it the same as the file name when you store it
File.ReadAllBytes(Path.Combine(folderPath, "image.png"));
答案 1 :(得分:0)
首先请确保您的图像路径正确,因为我认为您粘贴的路径是错误的,因为开始时使用/File:
,看来您应该分割该部分并使用其余部分这是您真正要使用的路径
尝试检查您要读取的目录是否以此创建。
Directory.Exists(profile_img.Source.ToString())
也可能是权限问题,但也许是错误的,因为我不熟悉Android:)