Eine Datei normal hochladen ist ja kein problem mit FtpPutFile_(...)
aber wie bekommt man es hin sie stückweise hochzuladen?
Es wäre auch ok wenn man den Fortschritt bei FtpPutFile_(...) abfragen könnte.
(Es geht mir eigentlich nur darum das in einer Progressbar anzeigen zu lassen)
Geht das überhaupt mit API und wenn ja wie?
PS: Suche hat nichts ergeben^^
Datei stückweise hochladen? (FTP)
Datei stückweise hochladen? (FTP)
[PB4.20]
Das hat irgendetwas mit "Append" zu tun. Der FTP Befehl, um Daten an eine Datei anzufügen, heißt "APPE" (Kurzform) bzw. "APPEND" (Langform).
Vielleicht findest du ja in der Richtung etwas.
Wichtig: Der Server kann das hinzufügen von Daten an eine Datei verbieten (kann also APPEND verweigern), je nachdem, welche Rechte gesetzt worden sind.
Vielleicht findest du ja in der Richtung etwas.
Wichtig: Der Server kann das hinzufügen von Daten an eine Datei verbieten (kann also APPEND verweigern), je nachdem, welche Rechte gesetzt worden sind.
PB 4.30
Code: Alles auswählen
Macro Happy
;-)
EndMacro
Happy End
hi Frogger,
ich hab dir mal nen beispielcode zusammengeschustert:
ich hab dir mal nen beispielcode zusammengeschustert:
Code: Alles auswählen
EnableExplicit
#INTERNET_SERVICE_FTP = 1
#INTERNET_OPEN_TYPE_DIRECT = 1
#FTP_TRANSFER_ASCII = 1
#FTP_TRANSFER_BINARY = 2
#INTERNET_STATUS_REQUEST_SENT = 31
#INTERNET_STATUS_HANDLE_CREATED = 60
#INTERNET_STATUS_HANDLE_CLOSING = 70
Structure FILEDATA
ServerName$
UserName$
Password$
LocalFile$
RemoteFile$
Port.l
hInternet.l
hConnect.l
StartTime.l
TotalByteLength.q
TotalBytesTransferred.q
EndStructure
Procedure InternetStatusCallback(hInternet, dwContext, dwInternetStatus, lpvStatusInformation, dwStatusInformationLength)
Protected *File.FILEDATA, time
Select dwInternetStatus
Case #INTERNET_STATUS_REQUEST_SENT
If dwContext
*File.FILEDATA = dwContext
*File\TotalBytesTransferred + PeekL(lpvStatusInformation)
EndIf
Case #INTERNET_STATUS_HANDLE_CREATED
Debug "Handle created: " + Str(PeekL(lpvStatusInformation))
If dwContext
*File.FILEDATA = dwContext
*File\StartTime = ElapsedMilliseconds()
*File\TotalBytesTransferred = 0
EndIf
Case #INTERNET_STATUS_HANDLE_CLOSING
If dwContext
*File.FILEDATA = dwContext
Debug StrF((*File\TotalBytesTransferred / 1024) / ((ElapsedMilliseconds() - *File\StartTime) / 1000),3) + " kb/s"
EndIf
Debug "Handle closed"
EndSelect
;Debug "hInternet: " + Str(hInternet)
;Debug "dwContext: " + Str(dwContext)
;Debug "dwInternetStatus: " + Str(dwInternetStatus)
;Debug "lpvStatusInformation: " + Str(lpvStatusInformation)
;Debug "dwStatusInformationLength: " + Str(dwStatusInformationLength)
EndProcedure
Procedure FtpPutFile(*File.FILEDATA)
If FtpPutFile_(*File\hConnect, *File\LocalFile$, *File\RemoteFile$, #FTP_TRANSFER_BINARY, *File)
Debug "Ok - " + Str(*File\TotalBytesTransferred) + " / " + Str(*File\TotalByteLength)
Else
Debug "FtpPutFile Error !"
EndIf
EndProcedure
Procedure CopyWindow(*File.FILEDATA)
Protected time, OldSize, Window, CounterID, ProgressID, kBytesID, Thread, Timer, Timer1000
*File\TotalByteLength = FileSize(*File\LocalFile$)
If *File\TotalByteLength > -1
*File\hInternet = InternetOpen_("FTP", #INTERNET_OPEN_TYPE_DIRECT, 0, 0, 0)
If *File\hInternet
InternetSetStatusCallback_(*File\hInternet, @InternetStatusCallback())
*File\hConnect = InternetConnect_(*File\hInternet, *File\ServerName$, *File\Port, *File\UserName$, *File\Password$, #INTERNET_SERVICE_FTP, 0, 0)
If *File\hConnect
Window = OpenWindow(#PB_Any, 0, 0, 300, 100, "", #PB_Window_ScreenCentered)
If Window And CreateGadgetList(WindowID(Window))
CounterID = TextGadget (#PB_Any, 10, 10, 280, 20, "0 / 0", #PB_Text_Center)
ProgressID = ProgressBarGadget (#PB_Any, 10, 30, 280, 30, 0, 1000, #PB_ProgressBar_Smooth)
kBytesID = TextGadget (#PB_Any, 10, 70, 280, 20, "0 kb/s", #PB_Text_Center)
Thread = CreateThread(@FtpPutFile(), *File)
Repeat
time = ElapsedMilliseconds()
If time >= Timer
Timer = time + 100
SetGadgetText(CounterID, StrQ(*File\TotalBytesTransferred) + " / " + StrQ(*File\TotalByteLength))
SetGadgetState(ProgressID, Int((1000 / *File\TotalByteLength) * *File\TotalBytesTransferred))
EndIf
If time >= Timer1000
Timer1000 = time + 1000
SetGadgetText(kBytesID, StrF(((*File\TotalBytesTransferred - OldSize) / 1024), 1) + " kb/s")
OldSize = *File\TotalBytesTransferred
EndIf
Select WaitWindowEvent(30)
Case #PB_Event_CloseWindow
Break
Case #NULL
If Thread
If WaitThread(Thread, 5)
Break
EndIf
EndIf
EndSelect
ForEver
CloseWindow(Window)
Else
MessageRequester("", "Window Error !")
EndIf
Else
MessageRequester("", "Connect Error !")
EndIf
InternetSetStatusCallback_(*File\hInternet, 0)
InternetCloseHandle_(*File\hInternet)
EndIf
Else
MessageRequester("", "File Error !")
EndIf
EndProcedure
Define File.FILEDATA
File\ServerName$ = "server"
File\Port = 21
File\UserName$ = "anonymous"
File\Password$ = "none@home.de"
File\LocalFile$ = "C:\testfile"
File\RemoteFile$ = "testfile"
CopyWindow(File)
PureBasic 4.40 (Windows - x86)
@tobe:
Sehr schönes Beispiel, danke schön. Allerdings werden die meisten wohl Texte übertragen wollen, sodaß man in der Zeile
Ein Code-Beispiel für das Anhängen an eine schon vorhandene Server-Datei mit APPE/APPEND habe ich übrigens schon einmal im englischen Forum veröffentlicht:
http://www.purebasic.fr/english/viewtopic.php?t=22984
Sehr schönes Beispiel, danke schön. Allerdings werden die meisten wohl Texte übertragen wollen, sodaß man in der Zeile
#FTP_TRANSFER_BINARY durch #FTP_TRANSFER_ASCII ersetzen sollte. Ansonsten hat Dein Beispiel sogar auf Anhieb auch beim FTP-Upload auf einen IBM-Mainframe funktioniert. Klasse!If FtpPutFile_(*File\hConnect, *File\LocalFile$, *File\RemoteFile$, #FTP_TRANSFER_BINARY, *File)
Ein Code-Beispiel für das Anhängen an eine schon vorhandene Server-Datei mit APPE/APPEND habe ich übrigens schon einmal im englischen Forum veröffentlicht:
http://www.purebasic.fr/english/viewtopic.php?t=22984