Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VBA + WinInet: проблема с загрузкой файла с FTP / 5 сообщений из 5, страница 1 из 1
17.03.2011, 16:50
    #37170636
ФТПшник
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA + WinInet: проблема с загрузкой файла с FTP
Други, прошу помощи. Есть простенький класс, который должен скачивать с фтп-сервера определенный файл, имя файла, который надо скачать, задается свойством FileName. Сама загрузка - функция GetFile:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
Option Explicit

Private Declare Function FtpGetFile _
Lib "wininet.dll" Alias "FtpGetFileA" ( _
ByVal hFtpSession As Long, _
ByVal lpszRemoteFile As String, _
ByVal lpszNewFile As String, _
ByVal fFailIfExists As Boolean, _
ByVal dwFlagsAndAttributes As Long, _
ByVal dwFlags As Long, _
ByVal dwContext As Long) As Boolean

Private Declare Function InternetOpen _
Lib "wininet.dll" Alias "InternetOpenA" ( _
ByVal sAgent As String, _
ByVal nAccessType As Long, _
ByVal sProxyName As String, _
ByVal sProxyBypass As String, _
ByVal nFlags As Long) As Long

Private Declare Function InternetConnect _
Lib "wininet.dll" Alias "InternetConnectA" ( _
ByVal hInternetSession As Long, _
ByVal sServerName As String, _
ByVal nServerPort As Integer, _
ByVal sUserName As String, _
ByVal sPassword As String, _
ByVal nService As Long, _
ByVal dwFlags As Long, _
ByVal dwContext As Long) As Long

Private Declare Function InternetGetLastResponseInfo _
Lib "wininet.dll" Alias "InternetGetLastResponseInfoA" ( _
  ByRef lpdwError As Long, _
  ByVal lpszBuffer As String, _
  ByRef lpdwBufferLength As Long _
) As Boolean

Private Declare Function InternetCloseHandle _
Lib "wininet.dll" (ByVal hInet As Long) As Integer

Private Declare Function GetLastError _
Lib "kernel32.dll" () As Long

Private Const INTERNET_SERVICE_FTP =  1 
Private Const INTERNET_SERVICE_GOPHER =  2 
Private Const INTERNET_SERVICE_HTTP =  3 
Private Const INTERNET_OPEN_TYPE_PRECONFIG =  0                     ' use registry configuration
Private Const INTERNET_OPEN_TYPE_DIRECT =  1                         ' direct to net
Private Const INTERNET_OPEN_TYPE_PROXY =  3                          ' via named proxy
Private Const INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY =  4    ' prevent using java/script/INS
Private Const INTERNET_FLAG_PASSIVE = &H8000000            ' used for FTP connections


Private m_ftpServer As String

Private m_ftpPort As Integer

Private m_fileName As String

Private m_login As String

Private m_password As String

Private m_useProxy As Boolean

Private m_proxy As String

Private m_passiveMode As Boolean


Public Property Get FtpServer() As String
    FtpServer = m_ftpServer
End Property

Public Property Let FtpServer(newValue As String)
    m_ftpServer = newValue
End Property


Public Property Get FtpPort() As Integer
    FtpPort = m_ftpPort
End Property

Public Property Let FtpPort(newValue As Integer)
    m_ftpPort = newValue
End Property


Public Property Get FileName() As String
    FileName = m_fileName
End Property

Public Property Let FileName(newValue As String)
    m_fileName = newValue
End Property


Public Property Get Login() As String
    Login = m_login
End Property

Public Property Let Login(newValue As String)
    m_login = newValue
End Property


Public Property Get Password() As String
    Password = m_password
End Property

Public Property Let Password(newValue As String)
    m_password = newValue
End Property


Public Property Get UseProxy() As Boolean
    UseProxy = m_useProxy
End Property

Public Property Let UseProxy(newValue As Boolean)
    m_useProxy = newValue
End Property

Public Property Get Proxy() As String
    Proxy = m_proxy
End Property

Public Property Let Proxy(newValue As String)
    m_proxy = newValue
End Property

Public Property Get PassiveMode() As Boolean
    PassiveMode = m_passiveMode
End Property

Public Property Let PassiveMode(newValue As Boolean)
    m_passiveMode = newValue
End Property



Private Sub Class_Initialize()
    m_ftpServer = "ftp.xxxx.ru"
    m_ftpPort =  21 
    m_fileName = "/Data.xls"
    m_login = "x"
    m_password = "y"
    m_useProxy = False
    m_proxy = ""
    m_passiveMode = False
    
End Sub

Public Function GetFile(ByRef SaveAs As String, ByRef win32ErrorCode As Long, ByRef errDescription As String) As Boolean

    Dim hINetSession As Long, hSession As Long, result As Boolean, errrr As String, length As Long
    
    length =  256 
    errrr = Space(length)
    
    If Me.UseProxy = True Then
        hINetSession = InternetOpen("Client", INTERNET_OPEN_TYPE_PROXY, Me.Proxy, vbNullString,  0 )
    Else
        hINetSession = InternetOpen("Client", INTERNET_OPEN_TYPE_PRECONFIG, vbNullString, vbNullString,  0 )
    End If
    
    If hINetSession =  0  Then
        GetFile = False
        win32ErrorCode = err.LastDllError
        errDescription = "Не удалось создать подключение к сети. "
        
        If Me.UseProxy = True Then
            errDescription = errDescription & "(Использовался прокси: " & Me.Proxy & ")"
        Else
            errDescription = errDescription & "(Прокси не использовался.)"
        End If
        
        GoTo lastLine
    End If
    
    'подключаемся к ФТП
    hSession = InternetConnect(hINetSession, m_ftpServer, m_ftpPort, m_login, m_password, INTERNET_SERVICE_FTP, IIf(m_passiveMode, INTERNET_FLAG_PASSIVE,  0 ),  0 )
    
    If hSession =  0  Then
        'упс, не получилось...
        GetFile = False
        win32ErrorCode = err.LastDllError
        
        errDescription = "Не удалось подключиться к FTP " & m_ftpServer & ":" & Str(m_ftpPort) & " используя логин/пароль: " & m_login & "/" & m_password & IIf(m_passiveMode, ", в пассивном режиме", ", в активном режиме") & Chr( 13 )
        
        If Me.UseProxy = True Then
            errDescription = errDescription & "(Использовался прокси: " & Me.Proxy & ")"
        Else
            errDescription = errDescription & "(Прокси не использовался.)"
        End If
        
        'пробуем достать расширенное описание ошибки:
        If InternetGetLastResponseInfo(win32ErrorCode, errrr, length) = True Then
            errDescription = errDescription & Chr( 13 ) & errrr
        End If
                
        InternetCloseHandle (hINetSession)
        
        GoTo lastLine
    End If

    result = FtpGetFile(hSession, m_fileName, SaveAs, False,  0 ,  1 ,  0 )
    
    If result = False Then
        win32ErrorCode = err.LastDllError
        errDescription = "Не удается скачать файл " & m_fileName & " с FTP " & m_ftpServer & ":" & Str(m_ftpPort) & ", логин/пароль: " & m_login & "/" & m_password & IIf(m_passiveMode, ", в пассивном режиме", ", в активном режиме") & Chr( 13 )
              
        If InternetGetLastResponseInfo(win32ErrorCode, errrr, length) = True Then
            errDescription = errDescription & Chr( 13 ) & errrr
        End If
        
    End If
    
    InternetCloseHandle (hSession)
    InternetCloseHandle (hINetSession)
    
    GetFile = result
    
lastLine:

End Function


У одного из клиентов не пашет загрузка. Разобравшись, выяснил, что не отрабатывает InternetConnect - возвращает 0, т.е. не может подключиться к ftp-серверу. При этом err.LastDllError возвращает 0, как-бы намекая что никакой ошибки нет!!!! Но я-то знаю что это не так - InternetConnect :) У кого-нибудь есть идеи, почему такое может быть?
И как понять, что за ошибка происходит?
Причем, если прокси-сервер отсутствует, то все качается нормально (у этого клиента прокси используется)
...
Рейтинг: 0 / 0
17.03.2011, 17:02
    #37170673
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA + WinInet: проблема с загрузкой файла с FTP
> Автор: ФТПшник
> И как понять, что за ошибка происходит?
> Причем, если прокси-сервер отсутствует, то все качается нормально (у этого клиента прокси используется)


А ты уверен, что твой прокси удовлетворяет требованиям микрософт для прокси, используемыми этими функциями?
http://msdn.microsoft.com/en-us/library/aa385096(v=VS.85).aspx The WinINet functions recognize only CERN type
proxies (HTTP only) and the TIS FTP gateway (FTP only). If Microsoft Internet Explorer is installed, these functions
also support SOCKS proxies. FTP requests can be made through a CERN type proxy either by changing them to an HTTP
request or by using InternetOpenUrl

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
17.03.2011, 17:11
    #37170706
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA + WinInet: проблема с загрузкой файла с FTP
ФТПшникУ одного из клиентов не пашет загрузка. Разобравшись, выяснил, что не отрабатывает InternetConnect - возвращает 0, т.е. не может подключиться к ftp-серверу. При этом err.LastDllError возвращает 0, как-бы намекая что никакой ошибки нет!!!!
InternetGetLastResponseInfo и LastDllError это две разные функции. Первую надо использовать. Про вторую надо забыть.
...
Рейтинг: 0 / 0
17.03.2011, 17:16
    #37170719
ФТПшник
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA + WinInet: проблема с загрузкой файла с FTP
Игорь Горбонос,

не уверен, но могу выяснить, что у них за прокся используется. Где можно посмотреть, какой прокси-сервер "CERN", а какой не-"CERN"?
...
Рейтинг: 0 / 0
17.03.2011, 17:23
    #37170741
ФТПшник
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA + WinInet: проблема с загрузкой файла с FTP
White Owl,

спасибо, сейчас попробую.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VBA + WinInet: проблема с загрузкой файла с FTP / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]