Я пытался сохранить изображение с URL-адреса, и у меня есть внутреннее исключение внутри внутреннего исключения, говорящее о том, что префикс URi не распознан.
Полное исключение:
[ERROR] FATAL UNHANDLED EXCEPTION: System.Reflection.TargetInvocationException:
An exception occurred during the operation, making the result invalid.
Check InnerException for exception details. --->
System.Net.WebException: An exception occurred during a WebClient request. --->
System.NotSupportedException: The URI prefix is not recognized.
Некоторый код:
imagen_tap.Tapped += async (s, e) =>
{
Console.WriteLine("URL IMAGE BRO::::::::: " + imagen.Source.ToString());
await api.DownloadImage(new Uri(imagen.Source.ToString()));
string path = Preferences.Get("filePath", "");
await Launcher.OpenAsync(new OpenFileRequest { File = new ReadOnlyFile(path) });
};
public async Task DownloadImage(Uri URL)
{
WebClient webClient = new WebClient();
string folderPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), "Images", "temp");
string fileName = URL.ToString().Split('/').Last();
string filePath = Path.Combine(folderPath, fileName);
webClient.DownloadDataCompleted += (s, e) =>
{
Directory.CreateDirectory(folderPath);
File.WriteAllBytes(filePath, e.Result); //Broken?
};
webClient.DownloadDataAsync(URL);
Preferences.Set("filePath", filePath);
}
РЕДАКТИРОВАТЬ: (забыл добавить это) (НЕ НАСТОЯЩИЙ URL-адрес). api.com/imagenes/partes/18005/2021062311191329243400.jpg
РЕДАКТИРОВАТЬ: (отвечая Джейсону, проверяя правильность URL-адреса на веб-клиенте)
Снимок экрана: открытие локального хранилища
РЕДАКТИРОВАТЬ:
Ну... я исправил префикс Uri...
Я изменил 2 вещи: в загружаемом изображении я изменил его с Task на строку и вернул строку. Код:
public string DownloadImageString(string URL)
{
WebClient webClient = new WebClient();
string folderPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), "Images", "temp");
string fileName = URL.ToString().Split('/').Last();
string filePath = Path.Combine(folderPath, fileName);
webClient.DownloadDataCompleted += (s, e) =>
{
Directory.CreateDirectory(folderPath);
File.WriteAllBytes(filePath, e.Result);
};
webClient.DownloadDataAsync(new Uri(URL));
return filePath;
}
А потом я изменил способ отправки URL.
Вместо отправки нового Uri(url) я отправляю строку. Эта строка снова монтируется вручную, а не с помощью imagen.Source (это было настоящим исправлением). Код:
Image imagen = new Image
{
Source = url + Foto.ID_Parte + "/" + Foto.Archivo
};
var imagen_tap = new TapGestureRecognizer();
imagen_tap.Tapped += async (s, e) =>
{
string path = api.DownloadImageString(url + Foto.ID_Parte + "/" + Foto.Archivo);
await Launcher.OpenAsync(new OpenFileRequest { File = new ReadOnlyFile(path) });
};
imagen.GestureRecognizers.Add(imagen_tap);
DownloadDataCompleted
. Очевидный следующий вопрос: значение filePath непосредственно перед `File.WriteAllBytes? И в чем ценность e.Result? - person ToolmakerSteve   schedule 21.07.2021await
перед строкойwebClient.DownloadDataAsync(URL);
. Не решит эту проблему, но позволит избежать блокировки потока во время загрузки. - person ToolmakerSteve   schedule 21.07.2021Uri = new Uri("https://i.stack.imgur.com/oXhTP.png"
. То же сообщение об ошибке? - person ToolmakerSteve   schedule 21.07.2021byte[] bytes_image = webClient.DownloadData(URL);
напрямую, чтобы увидеть, возвращает ли он данные, см. образец здесь: stackoverflow.com/a/60090843/8187800. - person ColeX - MSFT   schedule 22.07.2021