read a txt file from and FTP ?

Started by fielder, March 11, 2019, 19:51:25

Previous topic - Next topic

fielder

it's possibile to read (just read) a file on an FTP server using readfile / readstream?
something like:

ReadStream("ftp::username:password:ftp.server.net/file.txt")

or i need to use an FTP module to access the file?

Derron

You might have a look at Brucey's bah.curl.
With default modules / "brl.stream" it is not possible.


bye
Ron

fielder


Qube

One of our members "decag" emailed me the below. Not sure why he sent it to my email address though :P

Ciao

io ho una sorta di 'libreria' per il modulo CURL... solo per semplificare alcune operazioni (ripetitive)

Con l'esempio sotto riportato (cambia ovviamente FTP, user e password) posso 'caricare' e 'scaricare' un determinato file (in questo caso un file con estensione bak).
Non penso ci siano differenze con file audio o di testo (forse la dimensione e qualche rischio per il buffer)

SuperStrict
Framework BaH.libcurl
Import BRL.StandardIO
Import BRL.FileSystem

Include "../lib/lib_curl2.bmx"

CURL_start()

CURL_SetUpload("t1.bak") 'what I want to upload to the server
'CURL_Upload(ftp_server_destination_path,user,password)
'CURL_Download(ftp_server_source_path,save_name,user,password)
CURL_Upload("ftp.graphio.net/temp/t1.bak","user_","****")
'CURL_Download("ftp.graphio.net/download/check.png","check.png"," user_  ","****")
CURL_Download("ftp.graphio.net/temp/t1.bak","t1-download.bak"," user_  ","****")


CURL_Info()

End  ' Fini!

Appena testato e sembra funzionare!

Ciao, fammi sapere se รจ stato utile :)

Code (blitzmax) Select

Rem

LIB CURL
comandi veloci

lib_curl2.bmx

v.1.0 13.02.2017



End Rem

Global curl:TCurlEasy = TCurlEasy.Create()
Global curl_uploadhelper:UploadHelper
Rem
curl.setOptInt(CURLOPT_FOLLOWLOCATION, 1)
curl.setWriteStream(out_stream) 'set where to write the file
curl.setProgressCallback(progressCallback) ' set the progress callback function
Local url:String="http://www.graphio.net/download/"+filename
curl.setOptString(CURLOPT_URL, url)
curl.setOptInt(CURLOPT_RESUME_FROM,fsize) 'set FROM where to restart the download
Local res:Int = curl.perform()
curl.cleanup()
If out_stream CloseFile out_stream
End Rem

Function CURL_Info:Int()
If curl
Print "CURL INFO"

Local t:TCurlInfo=curl.GetInfo()
Print "Connect time : "+t.ConnectTime()
Else
Print "CURL INFO - not available"
End If
Return 0

End Function

Function CURL_Download:Int(source$,dest$,user$,password$)
Print "[CURL_DOWNLOAD]"
Print "Source <"+source+">   -    Dest <"+dest+">"
If curl=Null CURL_start();Print "(Curl Start!)"

If FileType(dest)<>0
Print "Warning, file does already exists!"
' Return -1
End If
Local out_stream:TStream=WriteFile(dest)

If out_stream=Null
Print "OUT_STREAM:NULL"
Return -1
End If



curl.setOptString(CURLOPT_USERPWD, user+":"+password)
curl.setOptInt(CURLOPT_FOLLOWLOCATION, 1)
curl.setWriteStream(out_stream) 'set where to write the file
curl.setOptString(CURLOPT_URL, source)
curl.setWriteStream(out_stream)



Local res:Int=Curl.Perform()
If res Print "***** " + CurlError(res) + " *****"

curl_info()



curl.cleanup()
curl=Null
If out_stream CloseFile out_stream
Return 0

End Function

Function CURL_Upload:Int(ftp$,user$,password$="")
If curl_uploadhelper=Null
Print "Attenzione! File da caricare non definito (UPLOAD=NULL)"
Return -1
End If

Print "[CURL_UPLOAD]"

If curl=Null CURL_start();Print "(Curl Start!)"


curl.setOptString(CURLOPT_URL, ftp)
curl.setOptString(CURLOPT_USERPWD, user+":"+password)
curl.setOptInt(CURLOPT_UPLOAD, True)
' set the upload size
curl.setOptLong(CURLOPT_INFILESIZE_LARGE, curl_uploadhelper.size)
' set the callback
curl.setReadCallback(curl_uploadhelper.Read, curl_uploadhelper)
' do the UPLOAD !
Local res:Int = curl.perform()
If res Then
Print "***** " + CurlError(res) + " *****"
End If
curl_uploadhelper.cleanup()
curl.cleanup()
curl=Null
Return 0

End Function

Function CURL_SetUpload:Int(filename$="")
If filename="" Return -1
curl_uploadhelper=UploadHelper.Create(filename$)

End Function

Function CURL_start:Int(_verbose:Int=1)
curl:TCurlEasy = TCurlEasy.Create()
curl.setOptInt(CURLOPT_VERBOSE, 1)
'curl.setDebugCallback(CURLdebugFunction)
curl.setDebugCallback(CURLdebugFunction)
Return 0
End Function

Function CURLdebugFunction:Int(data:Object, msgType:Int, message:String)

' we only care about server info
If msgType = CURLINFO_HEADER_IN Then
Print message
End If

End Function

Type UploadHelper

Field name:String
Field size:Int
Field currentPos:Int

Field stream:TStream

Function Create:UploadHelper(file:String)
Local this:UploadHelper = New UploadHelper

this.name = file
this.size = FileSize(file)
Print "File : <"+file+"> Size: <"+this.size+">"
Return this
End Function

Method DoRead:Int(BUFFER:Byte Ptr, size:Int)
If Not stream Then
stream = ReadStream(name)
currentPos = 0
End If

Local count:Int = Stream.Read( BUFFER, size )
currentPos :+ count

Return count
End Method

Function Read:Int(BUFFER:Byte Ptr, size:Int, data:Object)
Return UploadHelper(data).DoRead(BUFFER, size)
End Function

Method CleanUp:Int()
If stream CloseFile stream
Return 0
End Method

End Type
Mac Studio M1 Max ( 10 core CPU - 24 core GPU ), 32GB LPDDR5, 512GB SSD,
Beelink SER7 Mini Gaming PC, Ryzen 7 7840HS 8-Core 16-Thread 5.1GHz Processor, 32G DDR5 RAM 1T PCIe 4.0 SSD
MSI MEG 342C 34" QD-OLED Monitor

Until the next time.

fielder