由于 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"));