Sample code for 30+ languages & platforms
PureBasic

HTTP multipart/form-data Upload

See more HTTP Examples

Demonstrates how to upload files to an HTTP server using a multipart/form-data POST.

Chilkat PureBasic Downloads

PureBasic
IncludeFile "CkHttpResponse.pb"
IncludeFile "CkHttp.pb"
IncludeFile "CkHttpRequest.pb"

Procedure ChilkatExample()

    success.i = 0

    ; This example requires the Chilkat API to have been previously unlocked.
    ; See Global Unlock Sample for sample code.

    http.i = CkHttp::ckCreate()
    If http.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    req.i = CkHttpRequest::ckCreate()
    If req.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    CkHttpRequest::setCkHttpVerb(req, "POST")
    CkHttpRequest::setCkContentType(req, "multipart/form-data")
    CkHttpRequest::setCkPath(req, "rcvFormDataUpload.aspx")

    ; Send an "Expect: 100-continue" header in the request.
    ; This causes the HTTP server to end a 100-continue response
    ; immediately after receiving the HTTP header.  The client
    ; (Chilkat) will receive this intermediate response, and if
    ; it's not an error response, it knows that the HTTP server will
    ; accept the data that is forthcoming.
    ; The alternative is to get an error response after trying to upload
    ; the entire contents of the files.
    CkHttpRequest::ckAddHeader(req,"Expect","100-continue")

    ; Call AddFileForUpload2 for each file to be uploaded in the HTTP multipart/form-data POST
    ; To allow Chilkat to determine the content-type automatically based on file-extension,
    ; call AddFileForUpload instead.

    ; The 1st arg is the filename passed in the HTTP request.
    ; The 2nd arg is the path in the local filesytem.
    ; The file is not loaded into memory.  It is streamed directly from the file
    ; when the HTTP POST is sent.
    success = CkHttpRequest::ckAddFileForUpload2(req,"starfish.jpg","c:/qa_data/starfish.jpg","image/jpg")
    If success = 0
        Debug CkHttpRequest::ckLastErrorText(req)
        CkHttp::ckDispose(http)
        CkHttpRequest::ckDispose(req)
        ProcedureReturn
    EndIf

    success = CkHttpRequest::ckAddFileForUpload(req,"something.pdf","c:/qa_data/something.pdf")
    If success = 0
        Debug CkHttpRequest::ckLastErrorText(req)
        CkHttp::ckDispose(http)
        CkHttpRequest::ckDispose(req)
        ProcedureReturn
    EndIf

    ; Its also possible to add a file from a string:
    success = CkHttpRequest::ckAddStringForUpload(req,"test.xml","test.xml","<abc>This is the test.xml content</abc>","utf-8")
    ; We'll assume success since no files are involved..

    ; This sends the HTTP request (with 3 files being uploaded) to
    ; http://www.mywebserver123abc.com/rcvFormDataUpload.aspx
    resp.i = CkHttpResponse::ckCreate()
    If resp.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    success = CkHttp::ckHttpSReq(http,"www.mywebserver123abc.com",80,0,req,resp)
    If success = 0
        Debug CkHttp::ckLastErrorText(http)
        CkHttp::ckDispose(http)
        CkHttpRequest::ckDispose(req)
        CkHttpResponse::ckDispose(resp)
        ProcedureReturn
    EndIf

    Debug "HTTP response status: " + Str(CkHttpResponse::ckStatusCode(resp))
    ; See the online reference documentation for 
    ; other information that can be obtained from the response object.

    ; To send using SSL/TLS, do this instead.
    ; This sends to https://www.mywebserver123abc.com/rcvFormDataUpload.aspx
    success = CkHttp::ckHttpSReq(http,"www.mywebserver123abc.com",443,1,req,resp)
    If success = 0
        Debug CkHttp::ckLastErrorText(http)
        CkHttp::ckDispose(http)
        CkHttpRequest::ckDispose(req)
        CkHttpResponse::ckDispose(resp)
        ProcedureReturn
    EndIf

    Debug "HTTP response status: " + Str(CkHttpResponse::ckStatusCode(resp))
    ; See the online reference documentation for 
    ; other information that can be obtained from the response object.


    CkHttp::ckDispose(http)
    CkHttpRequest::ckDispose(req)
    CkHttpResponse::ckDispose(resp)


    ProcedureReturn
EndProcedure