由于 DirectoryNotFoundException 无法上传图片
Can't upload an Image due to DirectoryNotFoundException
我正在使用一个名为 ImageCropper.Forms 的图像裁剪器库,当我完成 select 从图库中下载图像时,它会裁剪它并将其附加到 Image
。
所以我尝试访问图像源以利用它进行上传,但出现此错误。
实际上,这个库中还有另一个名为 Xam.Plugin.Media 的库,它有助于 select 来自画廊的图像或用相机拍照。
System.IO.DirectoryNotFoundException: Could not find a part of the
path "/File:
/data/user/0/com.nl.via/cache/cropped5748405962114920444.jpg".
at System.IO.FileStream..ctor (System.String path, System.IO.FileMode mode, System.IO.FileAccess access,
System.IO.FileShare share, System.Int32 bufferSize, System.Boolean
anonymous, System.IO.FileOptions options) [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);
}
然后在附加 Pick 之后,我将 Pick 上传到服务器:
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());
所以我想知道上传裁剪图片的最佳方法是什么?
编辑:
当我使用 Device File Explorer 时,我看到一个没有 user/0/
的不同路径,下面是一个 Image ,路径是 data/com.nl.via/cache/cropped1030309698891957373.jpg
:
但是打印出来的是data/user/0/com.nl.via/cache/cropped1030309698891957373.jpg
。
首先确保你的图像路径是正确的,因为我认为你粘贴的路径是错误的,因为开头的 /File:
,看来你应该拆分那部分并使用其余的是您真正想要使用的路径
尝试检查您尝试读取的目录是否是用此创建的。
Directory.Exists(profile_img.Source.ToString())
也可能是权限问题,但也许我错了,因为我不熟悉 Android :)
尝试将文件存储到您应用的本地存储:
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"));
我正在使用一个名为 ImageCropper.Forms 的图像裁剪器库,当我完成 select 从图库中下载图像时,它会裁剪它并将其附加到 Image
。
所以我尝试访问图像源以利用它进行上传,但出现此错误。
实际上,这个库中还有另一个名为 Xam.Plugin.Media 的库,它有助于 select 来自画廊的图像或用相机拍照。
System.IO.DirectoryNotFoundException: Could not find a part of the path "/File: /data/user/0/com.nl.via/cache/cropped5748405962114920444.jpg". at System.IO.FileStream..ctor (System.String path, System.IO.FileMode mode, System.IO.FileAccess access, System.IO.FileShare share, System.Int32 bufferSize, System.Boolean anonymous, System.IO.FileOptions options) [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);
}
然后在附加 Pick 之后,我将 Pick 上传到服务器:
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());
所以我想知道上传裁剪图片的最佳方法是什么?
编辑:
当我使用 Device File Explorer 时,我看到一个没有 user/0/
的不同路径,下面是一个 Image ,路径是 data/com.nl.via/cache/cropped1030309698891957373.jpg
:
但是打印出来的是data/user/0/com.nl.via/cache/cropped1030309698891957373.jpg
。
首先确保你的图像路径是正确的,因为我认为你粘贴的路径是错误的,因为开头的 /File:
,看来你应该拆分那部分并使用其余的是您真正想要使用的路径
尝试检查您尝试读取的目录是否是用此创建的。
Directory.Exists(profile_img.Source.ToString())
也可能是权限问题,但也许我错了,因为我不熟悉 Android :)
尝试将文件存储到您应用的本地存储:
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"));