Path.Combine на URL дает исключение: формат данного пути не поддерживается
У меня ошибка в следующем коде
Uri imagesrc = new Uri("http://somewebsite.com/demo/images/slideshow/29.jpg");
Image image = Image.FromFile(Path.Combine("/comph/", imagesrc.ToString()));
Я также попробовал следующий код - где /comph/
мой корневой каталог
Image.FromFile(Path.Combine("/comph/","http://some_other_website.com/demo/images/slideshow/29.jpg");
Приведенный выше URL-адрес изображения правильный, когда я вставляю этот URL в браузер, он показывает изображение.
С помощью приведенного выше кода возникает исключение:
Формат данного пути не поддерживается.
Что не так с этим кодом?
3 ответа
Path.Combine
не поддерживает URL.
Вы должны будете сначала преобразовать URL в (относительный) путь к файлу, если хотите использовать Path.Combine
Если вы хотите управлять URL-адресами, вы можете использовать конструктор Url, который берет базовый URL-адрес и относительный URL-адрес и объединяет их.
Быстрый (но немного грязный способ) состоит в том, чтобы взять местную часть от Ури, убрать корень "/"
и затем используйте Path.Combine:
Uri imagesrc = new Uri("http://somewebsite.com/demo/images/slideshow/29.jpg");
string target = Path.Combine("comph", imagesrc.LocalPath.TrimStart('/'));
результат "comph\demo/images/slideshow/29.jpg"
, который будет работать, но вы могли бы заменить /
с \
для косметики.
Не использовать Path.Combine
для URL. Этот метод предназначен для использования с локальными путями файловой системы!
Хотя это может работать не во всех случаях, вы часто можете использовать new Uri(Uri, Uri)
объединить URL:
// using System;
var absoluteUri = new Uri('http://example.com/path/');
var relativeUri = new Uri('./more', UriKind.Relative);
var combinedUri = new Uri(absoluteUri, relativeUri);
Добавление пути к существующему URL-адресу работает корректно только тогда, когда путь к существующему URL-адресу заканчивается /
; в противном случае в объединенном URL может отсутствовать последний сегмент пути.
(Я не проверял, что происходит, когда в существующем URL уже есть строка или фрагмент запроса, кстати. Убедитесь, что проверили это сами, если это может быть уместно в вашем случае.)