由于DirectoryNotFoundException

时间:2019-05-16 14:27:42

标签: c# xamarin.forms crop image-gallery

我正在使用一个名为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

enter image description here

但是打印的是data/user/0/com.nl.via/cache/cropped1030309698891957373.jpg

2 个答案:

答案 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:)