Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
Ты чего такой несамостоятельный? -)) 23.09.09 08:49 Число просмотров: 3470
Автор: HandleX <Александр М.> Статус: The Elderman Отредактировано 23.09.09 09:01 Количество правок: 1
|
Залазь на MSDN и не вылазь оттуда, пока всё не заработает! -))
Вот тебе рабочий пример работы с вининетом.
Правда, метод используется PUT, и прокси не юзает. Но так всё похоже.
Извини за языг программирования, но разобраться можно, я надеюсь -))
AnyStoredFiles>>copyFile: filePath to: serverName url: anUrlString
| inetLib hInternet |
inetLib := WinInetLibrary default.
"Получаем хендл для тырнета"
hInternet :=inetLib
internetOpen: SessionManager current applicationShortName
accessType: INTERNET_OPEN_TYPE_PRECONFIG
proxyName: nil
proxyByPass: nil
flags: 0.
hInternet isNull ifTrue: [^Win32Error signal].
[hConnect |
"Подключаемся к серверу"
hConnect := inetLib
internetConnect: hInternet
serverName: serverName
serverPort: INTERNET_INVALID_PORT_NUMBER "Это порт по умолчанию"
userName: 'HandleX' "Это я для потомков ;-)"
password: 'none'
service: INTERNET_SERVICE_HTTP
flags: 0 context: 0.
hConnect isNull ifTrue: [Win32Error signal].
[hRequest |
"Подготавливаем к использованию метод HTTP->PUT"
hRequest := inetLib
httpOpenRequest: hConnect
verb: 'PUT'
"Наименование объекта — серверная папка + имя файла"
objectName: (
anUrlString last == $/
ifTrue:[anUrlString, (File splitFilenameFrom: filePath)]
ifFalse: [anUrlString, '/', (File splitFilenameFrom: filePath)]
)
version: nil
"Указываем реферрера — какой класс объекта вызвал этот метод, может пригодится когда-нибудь"
referrer: self name
acceptTypes: nil
flags: 0 context: nil.
hRequest isNull ifTrue: [Win32Error signal].
[buff buffSize hFile fSize bytesWritten inetBuff |
"Открываем файл, создаём все нужные буферы"
buff := ByteArray newFixed: (buffSize := 2048).
hFile := FileStream read: filePath text: false.
fSize := hFile size.
bytesWritten := DWORD new.
"Отправляем запрос с указанием размера файла"
inetBuff := INTERNET_BUFFERS new.
inetBuff dwBufferTotal: fSize.
(inetLib
httpSendRequestEx: hRequest
buffersIn: inetBuff
buffersOut: nil
flags: HSR_INITIATE context: nil) ifFalse: [Win32Error signal].
[hFile atEnd] whileFalse:
[bytesRead |
"Отправляем файл блоками, равными размеру буфера или меньше, если остаток меньше буфера"
bytesRead := (hFile position + buffSize > fSize) ifFalse: [buffSize] ifTrue: [fSize - hFile position].
hFile next: bytesRead into: buff startingAt: 1.
(inetLib
internetWriteFile: hRequest
buffer: buff yourAddress
numberOfBytesToWrite: bytesRead
numberOfBytesWritten: bytesWritten) ifFalse: [Win32Error signal]].
hFile close.
(inetLib httpEndRequest: hRequest buffersOut: nil flags: 0 context: nil) ifFalse: [Win32Error signal]
"Закрываем все используемые хендлы"
] ensure: [inetLib internetCloseHandle: hRequest]
] ensure: [inetLib internetCloseHandle: hConnect]
] ensure: [inetLib internetCloseHandle: hInternet]
---
|
|
|