сохранение изображений на диск

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Invader
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 18.01.2005 (Вт) 4:22
Откуда: Молдавия, Виноград

сохранение изображений на диск

Сообщение Invader » 07.08.2012 (Вт) 3:58

после вебзапроса я получаю страницу - распарсив её, получаю ссылку следующего вида,
http://www.bla/bla/gallery/7_big.jpg
если я её указываю в пикчербоксе как путь, она открывается, вопрос как её сохранить на диск
использовал код
Код: Выделить всё
Dim Address = "http://www.bla/bla/gallery/7_big.jpg"
        Using WC As New Net.WebClient
            WC.Headers(Net.HttpRequestHeader.Cookie) = "nm=val"
            Dim FileData As Byte() = WC.DownloadData(Address)
            IO.File.WriteAllBytes("c:\100\542\88171.jpg", FileData) '<---Здесь проблема
        End Using

дело в том что такой директории ещё нет, и я не смогу создать их заранее!
Нет ли другого способа , скажем стринговая переменная содержит в себе полный путь поставлять её там где нужно указать место под сохранение пусть с именем файла и расширением, но чтоб не выбрасывало ошибку мол патч или путь не найден!
умён и жаден,
характер отсуствует

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 07.08.2012 (Вт) 7:27

Код: Выделить всё
If Not Directory.Exists("c:\100\542") Then Directory.CreateDirectory("c:\100\542")

Invader
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 18.01.2005 (Вт) 4:22
Откуда: Молдавия, Виноград

Re: сохранение изображений на диск

Сообщение Invader » 09.08.2012 (Чт) 10:08

а как можно отследить конец загрузки, чтоб можно было перейти к следующему сохранению, при многократном потоковом копировании
умён и жаден,
характер отсуствует

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 09.08.2012 (Чт) 12:10

Не понял. Операция же синхронная, судя по твоему коду.

Invader
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 18.01.2005 (Вт) 4:22
Откуда: Молдавия, Виноград

Re: сохранение изображений на диск

Сообщение Invader » 09.08.2012 (Чт) 15:51

то есть синхронная, если я подставлю вместо адреса в строчку кода
Код: Выделить всё
Dim Address = "http://www.bla/bla/gallery/7_big.jpg"

переменную, поучающую адреса из текстового документа,
и переменную на путь копирования, не получится ли так, что первая картинка грузится в комп, но уже подставлен другой путь в код...
умён и жаден,
характер отсуствует

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 09.08.2012 (Чт) 17:32

Invader писал(а):то есть синхронная, если я подставлю вместо адреса в строчку кода

Синхронная операция - та, которая выполняется в том же потоке. Асинхронная - которая выполняется в другом потоке, т. е. паралельно.
Я не пользовался классом Net.WebClient, но судя по названию метода и возвращаемому типу, он является синхронным, что означает, что сохранение в файл даже не начнётся до завершения его скачивания.

Invader писал(а):переменную, поучающую адреса из текстового документа, и переменную на путь копирования

Ты хочешь хранить 2 значения в одной переменной? Как напишешь, так и будет работать.

Invader
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 18.01.2005 (Вт) 4:22
Откуда: Молдавия, Виноград

Re: сохранение изображений на диск

Сообщение Invader » 12.08.2012 (Вс) 17:17

вот вопрос по поводу кода
Код: Выделить всё
dim url as string
Dim Address = url
        Using WC As New Net.WebClient
            WC.Headers(Net.HttpRequestHeader.Cookie) = "nm=val"
            Dim FileData As Byte() = WC.DownloadData(Address)'<---Здесь проблема Удаленный сервер
                                                             'возвратил ошибку: (404) Не найден.
            IO.File.WriteAllBytes("c:\100\542\88171.jpg", FileData)
        End Using
Loop


Удаленный сервер возвратил ошибку: (404) Не найден. ошибка !
пояснение: url принимает значения из найденных в интернете.
1. есть ли программная возможность игнорировать ошибку: (404) то есть если она возникает просто переходить к следующему значению url ?
2. и второй вопрос: ошибка была вызвана в следствии, подставленным адресом вида
http://tonkosti.ru/images/9/95/%25D0%25A5%25D0%25BE%25D0%25BB%25D0%25BB_Aladdin_Beach.jpg
то есть слово Холл было заменено на кодировку urlencode,
как привести кодировку в нормальный вид?
умён и жаден,
характер отсуствует

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: сохранение изображений на диск

Сообщение FireFenix » 12.08.2012 (Вс) 18:11

Ну неужели так сложно залезть в гугл и найти ответы? ведь всё легко и просто найти... Изображение Изображение
http://bbs.vbstreets.ru/viewtopic.php?f=68&t=41742

Invader писал(а):1. есть ли программная возможность игнорировать ошибку: (404) то есть если она возникает просто переходить к следующему значению url ?

Сложно проявить смекалку и обернуть в Try Catch? или найти в гугле WebClient error handling?

Invader писал(а):2. и второй вопрос: ошибка была вызвана в следствии, подставленным адресом вида
http://tonkosti.ru/images/9/95/%25D0%25A5%25D0%25BE%25D0%25BB%25D0%25BB_Aladdin_Beach.jpg

Сложно найти классы URI или HttpUtility и посмотреть их методы?
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Invader
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 18.01.2005 (Вт) 4:22
Откуда: Молдавия, Виноград

Re: сохранение изображений на диск

Сообщение Invader » 12.08.2012 (Вс) 18:22

не сложно
Код: Выделить всё
Imports System.web

затем
строчка
Код: Выделить всё
Dim Address =HttpUtility.UrlDecode(url) 'Ошибка   "HttpUtility" не объявлен. Может быть
                                 недоступен из-за своего уровня защиты.

умён и жаден,
характер отсуствует

Invader
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 18.01.2005 (Вт) 4:22
Откуда: Молдавия, Виноград

Re: сохранение изображений на диск

Сообщение Invader » 12.08.2012 (Вс) 19:05

вот что сиё означает
Изображение
как правильно подключить HttpUtility.UrlDecode
умён и жаден,
характер отсуствует

edyapd
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 03.10.2011 (Пн) 19:54

Re: сохранение изображений на диск

Сообщение edyapd » 12.08.2012 (Вс) 20:26

В свойсвах проекта "Ссылки", посмотрите есть ли у вас ссылка на System.Web.
Если нет, то её надо добавить вручную

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 12.08.2012 (Вс) 20:54

Invader писал(а):2. и второй вопрос: ошибка была вызвана в следствии, подставленным адресом вида
http://tonkosti.ru/images/9/95/%25D0%25A5%25D0%25BE%25D0%25BB%25D0%25BB_Aladdin_Beach.jpg
то есть слово Холл было заменено на кодировку urlencode
как привести кодировку в нормальный вид?

Это ещё и UTF-8... Руками - не вариант?

Invader писал(а):вот что сиё означает

А зачем ты tlb подключаешь? К тому же, у тебя версия .NET не соответствуей той, которая используется в проекте.

Invader
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 18.01.2005 (Вт) 4:22
Откуда: Молдавия, Виноград

Re: сохранение изображений на диск

Сообщение Invader » 12.08.2012 (Вс) 21:14

Qwertiy писал(а):Это ещё и UTF-8... Руками - не вариант?

у меня переменная url принимает около 40 000 вариантов :shock:
Qwertiy писал(а):А зачем ты tlb подключаешь? К тому же, у тебя версия .NET не соответствуей той, которая используется в проекте.

простите, а как надо :oops:
умён и жаден,
характер отсуствует

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 12.08.2012 (Вс) 23:08

Invader писал(а):
Qwertiy писал(а):Это ещё и UTF-8... Руками - не вариант?

у меня переменная url принимает около 40 000 вариантов :shock:

Я имел в виду что-то типа
Код: Выделить всё
Regex.Replace(Url, "%[\dA-Fa-f]{4}", Function(M As Match) Encoding.UTF8.GetChars(New Byte() { M.Value.Substring(1,2), M.Value.Substring(3) }))


Invader писал(а):простите, а как надо :oops:

Да по-моему, никак... А если надо, то первая вкладка Add Reference.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: сохранение изображений на диск

Сообщение FireFenix » 13.08.2012 (Пн) 0:17

Есть мнение, что сам линк неверный, и такое как в нём кодирование - не используется в вебе http://ru.wikipedia.org/wiki/Url

Более того, если бы ТС хоть немного потратил времени больше чем 10 секунд в поиске гугла, он бы нашёл System.Uri.UnescapeDataString

Код: Выделить всё
MsgBox(System.Uri.UnescapeDataString("http://ru.wikipedia.org/wiki/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B8"))
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 13.08.2012 (Пн) 0:56

FireFenix писал(а):Есть мнение, что сам линк неверный, и такое как в нём кодирование - не используется в вебе http://ru.wikipedia.org/wiki/Url

Тем не менее, реально оно периодически встречается...

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: сохранение изображений на диск

Сообщение FireFenix » 13.08.2012 (Пн) 1:06

Qwertiy писал(а):
FireFenix писал(а):Есть мнение, что сам линк неверный, и такое как в нём кодирование - не используется в вебе http://ru.wikipedia.org/wiki/Url

Тем не менее, реально оно периодически встречается...

Как оно может встречаться в вебе, если в rfc написано, что любой символ url может кодироваться только октетами, где каждый октет есть % и 2х символьных hex?
Пример?

Более того ни один бразуер не должен брать такие линки.
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

edyapd
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 03.10.2011 (Пн) 19:54

Re: сохранение изображений на диск

Сообщение edyapd » 13.08.2012 (Пн) 5:47

Invader писал(а):2. и второй вопрос: ошибка была вызвана в следствии, подставленным адресом вида http://tonkosti.ru/images/9/95/%25D0%25A5%25D0%25BE%25D0%25BB%25D0%25BB_Aladdin_Beach.jpg то есть слово Холл было заменено на кодировку urlencode, как привести кодировку в нормальный вид?

А как у тебя получилась такая кодировка? Я открываю исходный в Опере, там в таком виде:
http://tonkosti.ru/images/9/95/%D0%A5%D0%BE%D0%BB%D0%BB_Aladdin_Beach.jpg

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 13.08.2012 (Пн) 7:30

FireFenix писал(а):Пример?
Более того ни один бразуер не должен брать такие линки.

Скорее всего, я что-то перепутал...

Invader
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 18.01.2005 (Вт) 4:22
Откуда: Молдавия, Виноград

Re: сохранение изображений на диск

Сообщение Invader » 13.08.2012 (Пн) 8:11

во первых я использую мозилу, открываем гугл картинки и нажимая на фотоаппарат (поиск по ссылке)вставляем сылку http://tophotels.ru/icache/hotel_photos/12/4/106/293636_740x550.jpg
в результатах Страницы с подходящими изображениями, в коде первой иконки видим
код:
<div style="float: left; padding-right: 5px; text-align: center; width: 65px;"><a href="http://www.google.ru
/imgres?imgurl=http://tonkosti.ru/images/9/95/%25D0%25A5%25D0%25BE%25D0%25BB%25D0%25BB_Aladdin_Beach.jpg&
amp;imgrefurl=http://tonkosti.ru/%D0%9E%D1%82%D0%B5%D0%BB%D1%8C_Aladdin_Beach_Resort_4*_%D0%A5%D1%83%D1%80
%D0%B3%D0%B0%D0%B4%D0%B0_%D0%95%D0%B3%D0%B8%D0%BF%D0%B5%D1%82&amp;h=176&amp;w=250&amp;sz=16&
amp;tbnid=h22_02iQOiprBM&amp;tbnh=140&amp;tbnw=200&amp;zoom=1&amp;usg=__E2J5AsI9WH4K6d2ArPDYK35yTIY=&
amp;hl=ru&amp;sa=X&amp;ei=e4koULbLBNOEhQfprICoAQ&amp;ved=0CFsQ8g0" target="_blank">

а переходя по сылке картинки видим адрес
http://tonkosti.ru/images/9/95/Холл_Aladdin_Beach.jpg
причем даже когда копирую и вставляю её на данном форуме, вместо Холл вижу
http://tonkosti.ru/images/9/95/%D0%A5%D0%BE%D0%BB%D0%BB_Aladdin_Beach.jpg
ЧТО это такое?????
умён и жаден,
характер отсуствует

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 13.08.2012 (Пн) 11:25

Это ведь всего лишь параметр, а не ссылка. Там никто не обязан соблюдать стандарты :)

Invader
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 18.01.2005 (Вт) 4:22
Откуда: Молдавия, Виноград

Re: сохранение изображений на диск

Сообщение Invader » 13.08.2012 (Пн) 14:32

здорово но именно там и только там прямые ссылки на фото
умён и жаден,
характер отсуствует

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 13.08.2012 (Пн) 14:55

Код: Выделить всё
Regex.Replace(Url, "%([\dA-Fa-f][\dA-Fa-f])([\dA-Fa-f][\dA-Fa-f])", Function(M As Match) "%" & M.Groups(2).Value & "%" & M.Groups(1).Value)

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: сохранение изображений на диск

Сообщение FireFenix » 13.08.2012 (Пн) 15:06

Invader писал(а):ЧТО это такое?????

А подумать и посмотреть что значит первый октет %25? http://ru.wikipedia.org/wiki/Url
т.к. это параметр, то логично что, чтобы передать кодированное значение как параметр, то бразуер %D0, вначале кодирует процент и добавляет оставшуюся строку

Логично, что нужно просто 2 раза декодировать URL
Код: Выделить всё
MsgBox(System.Uri.UnescapeDataString(System.Uri.UnescapeDataString("http://www.google.ru/imgres?imgurl=http://tonkosti.ru/images/9/95/%25D0%25A5%25D0%25BE%25D0%25BB%25D0%25BB_Aladdin_Beach.jpg&amp;imgrefurl=http://tonkosti.ru/%D0%9E%D1%82%D0%B5%D0%BB%D1%8C_Aladdin_Beach_Resort_4*_%D0%A5%D1%83%D1%80%D0%B3%D0%B0%D0%B4%D0%B0_%D0%95%D0%B3%D0%B8%D0%BF%D0%B5%D1%82&amp;h=176&amp;w=250&amp;sz=16&amp;tbnid=h22_02iQOiprBM&amp;tbnh=140&amp;tbnw=200&amp;zoom=1&amp;usg=__E2J5AsI9WH4K6d2ArPDYK35yTIY=&amp;hl=ru&amp;sa=X&amp;ei=e4koULbLBNOEhQfprICoAQ&amp;ved=0CFsQ8g0")))
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 13.08.2012 (Пн) 15:08

FireFenix писал(а):Логично, что нужно просто 2 раза декодировать URL

Как всё просто :) Тоже не заметил ведь :lol:

Invader
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 18.01.2005 (Вт) 4:22
Откуда: Молдавия, Виноград

Re: сохранение изображений на диск

Сообщение Invader » 13.08.2012 (Пн) 17:09

FireFenix писал(а):Сложно проявить смекалку и обернуть в Try Catch?

а как бы выглядела запись Try Catch на ошибку 404
и как можно также проигнорировать если
при выполнении в строке
Код: Выделить всё
                Dim FileData As Byte() = WC.DownloadData(Address)

выдает сообщение что удалённый сервер не отвечает, проигнорировать в смыле перейти к следующему значению для url
умён и жаден,
характер отсуствует

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 13.08.2012 (Пн) 18:24

Invader писал(а):а как бы выглядела запись Try Catch на ошибку 404

:evil: :evil: :evil: If Ex.StatusCode <> 404 Then Throw Ex Остальное нагуглишь!

Invader писал(а):выдает сообщение что удалённый сервер не отвечает, проигнорировать в смыле перейти к следующему значению для url

Google: Try Catch VB.NET :evil:
И On Error никто не отменял!

edyapd
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 03.10.2011 (Пн) 19:54

Re: сохранение изображений на диск

Сообщение edyapd » 13.08.2012 (Пн) 18:34

С одной стороны мне как новичку интересно порешать всякие задачки:
Код: Выделить всё
        Try
            Dim Address As String = "http://tonkosti.ru/images/9/95/%25D0%25A5%25D0%25BE%25D0%25BB%25D0%25BB_Aladdin_Beach.jpg"
            Address = HttpUtility.UrlDecode(Address)
            Address = HttpUtility.UrlDecode(Address)
            Using WC As New Net.WebClient
                WC.Headers(Net.HttpRequestHeader.Cookie) = "nm=val"
                Dim FileData As Byte() = WC.DownloadData(Address)
            End Using
        Catch ex As WebException
            MsgBox(ex.Message)
            If ex.Status = WebExceptionStatus.ProtocolError Then
                MsgBox(CType(ex.Response, HttpWebResponse).StatusCode)
                MsgBox(CType(ex.Response, HttpWebResponse).StatusDescription)
            End If
        End Try

А с другой, неужели так лень поискать в MSDN. У меня на всё ушло 5 минут

Invader
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 18.01.2005 (Вт) 4:22
Откуда: Молдавия, Виноград

Re: сохранение изображений на диск

Сообщение Invader » 13.08.2012 (Пн) 19:05

edyapd писал(а):С одной стороны мне как новичку интересно порешать всякие задачки:

спасио за пример но после выдачи сообщения в MsgBox что удалёный сервер не отвечает, жму ок и вылетает прога с ошибкой в строке
Код: Выделить всё
Dim FileData As Byte() = WC.DownloadData(Address)

Значение не может быть неопределенным.
Имя параметра: address
перед строками MsgBox
вставил строчку exit try проблема осталась
умён и жаден,
характер отсуствует

edyapd
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 03.10.2011 (Пн) 19:54

Re: сохранение изображений на диск

Сообщение edyapd » 13.08.2012 (Пн) 20:29

На форме Бутон, Текстбокс, Лебл
Я не проверяю чего он там грузит, но факт что грузит или выводит сообщение об отсутствие адреса.
Код: Выделить всё
Imports System.Web
Imports System.Net
Public Class Form1

    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Try
            Dim Address As String = TextBox1.Text '"http://tonkosti.ru/images/9/95/%254D0%25A5%25D0%25BE%25D0%25BB%25D0%25BB_Aladdin_Beach.jpg"
            Address = HttpUtility.UrlDecode(Address)
            Address = HttpUtility.UrlDecode(Address)
            Using WC As New Net.WebClient
                WC.Headers(Net.HttpRequestHeader.Cookie) = "nm=val"
                Dim FileData As Byte() = WC.DownloadData(Address)
                'Здесь запись на диск
                '=========================
                ' IO.File.WriteAllBytes("c:\100\542\88171.jpg", FileData)
                '=========================
                Label1.Text = "Данные сохранены"
            End Using
        Catch ex As WebException
            If ex.Status = WebExceptionStatus.ProtocolError Then
                If CType(ex.Response, HttpWebResponse).StatusCode = 404 Then
                    Label1.Text = "Адреса не существует"
                End If
            End If
        End Try
    End Sub
End Class
Вложения
Load.rar
(8.73 Кб) Скачиваний: 183

След.

Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13

    TopList  
cron