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 уже есть строка или фрагмент запроса, кстати. Убедитесь, что проверили это сами, если это может быть уместно в вашем случае.)

Другие вопросы по тегам