Question:
Hi!
I am trying to do a https upload of a file to a CGI (https with basic http auth). I can do that successfully from a browser using the following form:
<form action="https://www.server.com/cgi/thisistheuploadcgiscript.pl" method="post"
enctype="multipart/form-data">
<input type="file" name="name" accept="text/*" maxlength="2097152">
<input type="submit">
</form>
I therefore assume that my CGI script is working properly.
When I try uploading the very same file using ChilkatActiveX in VB6 (I do have a Chilkat license) it generally seems to work but the "name" CGI parameter given in the AddFileForUpload Method doesn't seem to be set, at least it is not available when reading the CGI params.
Below is the code I use where the CGI param "name" should be "999997" and it is "".
Setting the "name" to "999997" in .AddFileForUpload is no mystery. I just don't get it.
I just found that adding additional parameters using .AddParam Key,Value does not work for me either. Maybe that's the heart of my problem.
Help will be appreciated!
T.
Private Sub UploadFile()
' based on example code from http://www.example-code.com/vb/vb6_http_post_progress.asp
Dim Hostname As String
Dim Success As Long
Hostname = "www.myhostname.com"
Set UploadHttp = New ChilkatHttp
Success = UploadHttp.UnlockComponent(ChilkatHttpLicense)
If (Success <> 1) Then
WriteDebugLog ("WebDownload unlock Error: " & vbCrLf & UploadHttp.LastErrorText)
Exit Sub
End If
UploadHttp.ConnectTimeout = 20
UploadHttp.FetchFromCache = 0
If Len(ProxyURL) > 0 Then
UploadHttp.ProxyDomain = ProxyURL
UploadHttp.ProxyPort = ProxyPort
If Len(ProxyUsername) > 0 Then
UploadHttp.ProxyLogin = ProxyUsername
UploadHttp.ProxyPassword = ProxyPassword
End If
End If
Set Cert = UploadHttp.GetServerSslCert(Hostname, 443)
If Not verifyWebCert(Hostname, Cert.Sha1Thumbprint) Then
Exit Sub
End If
UploadHttp.login = "TheUsername"
UploadHttp.Password = "ThePassword"
UploadHttp.HeartbeatMs = 100
Dim req As New ChilkatHttpRequest
' req.UseUpload
req.HttpVerb = "PUT"
req.ContentType = "multipart/form-data"
req.AddFileForUpload "999997", "C:\This\is\a\valid\path\to\the\file.txt"
req.Path = "/cgi/thisistheuploadcgiscript.pl"
Dim response As ChilkatHttpResponse
Set response = UploadHttp.SynchronousRequest(Hostname, 443, True, req)
WriteDebugLog UploadHttp.LastErrorText
End Sub
' The AbortCheck event is called periodically according to the
' HeartbeatMs property setting.
Private Sub UploadHttp_AbortCheck(abort As Long)
If (ProgressBar1.Value > 95) Then
ProgressBar1.Value = 0
Else
ProgressBar1.Value = ProgressBar1.Value + 5
End If
End Sub
' This event fires just before beginning to receive the HTTP response.
Private Sub UploadHttp_BeginReceive()
WriteDebugLog "Begin Receive"
End Sub
' This event fires just before beginning to send the HTTP upload.
Private Sub UploadHttp_BeginSend()
WriteDebugLog "Begin Send"
End Sub
' This event fires just after the HTTP response has been received in full.
' (or after a failure in reading the response). If reading the response
' failed, success is set to 0. Otherwise it is set to 1.
Private Sub UploadHttp_EndReceive(ByVal Success As Long)
WriteDebugLog "End Receive"
CloseProgress
If Success = 0 Then MsgBox "upload failed"
End Sub
' This event fires just after the HTTP upload has been sent.
' (or after a failure in sending the upload). If sending the upload
' failed, success is set to 0. Otherwise it is set to 1.
Private Sub UploadHttp_EndSend(ByVal Success As Long)
WriteDebugLog "End Send"
CloseProgress
If Success = 0 Then MsgBox "upload failed"
End Sub
' The pctDone argument will contain a value from 1 to 100.
Private Sub UploadHttp_PercentDone(ByVal percent As Long, abort As Long)
ProgressBar1.Value = percent
End Sub
LastErrorTXT
ChilkatLog: SynchronousRequest: DllDate: Jun 23 2015 ChilkatVersion: 9.5.0.51 UnlockPrefix: 4SSDEkHttp Username: UserName Architecture: Little Endian; 32-bit Language: ActiveX VerboseLogging: 0 domain: www.myhostname.com port: 443 ssl: 1 httpRequest: httpVersion: 1.1 verb: PUT path: /cgi/thisistheuploadcgiscript.pl contentType: multipart/form-data charset: windows-1252 sendCharset: 0 mimeHeader: requestParams: requestItem: name: 999997 fileOnDisk: C:\This\is\a\valid\path\to\the\file.txt numValueBytes: 52 --requestItem requestItem: name: customer_id value: 999997 --requestItem --requestParams --httpRequest readTimeout: 20 connectTimeout: 20 approxRequestSize: 228 fullRequest: a_synchronousRequest: generateRequest: httpRequestGenStartLine: genStartLine: startLine: PUT /cgi/thisistheuploadcgiscript.pl HTTP/1.1 --genStartLine --httpRequestGenStartLine addCookies: Not auto-adding cookies. sendCookies: 1 cookieDir: --addCookies genMultipartFormData: requestParam: name: 999997 filename: C:\This\is\a\valid\path\to\the\file.txt --requestParam requestParam: name: customer_id --requestParam --genMultipartFormData --generateRequest fullHttpRequest: domain: www.myhostname.com port: 443 ssl: 1 openHttpConnection: Opening connection directly to HTTP server. httpHostname: www.myhostname.com httpPort: 443 ssl: 1 HTTPS secure channel established. --openHttpConnection connectTime: Elapsed time: 313 millisec sendRequestHeader: sendHeaderElapsedMs: 0 --sendRequestHeader sendRequestBody: genMultipartFormData: requestParam: name: 999997 filename: C:\This\is\a\valid\path\to\the\file.txt --requestParam requestParam: name: customer_id --requestParam --genMultipartFormData sendBodyElapsedMs: 0 --sendRequestBody statusCode: 401 statusText: Unauthorized readResponseBody: contentLength: 364 --readResponseBody checkCloseConnection: Response includes connection:close header (or proxy-connection:close header) --checkCloseConnection --fullHttpRequest generateRequest: httpRequestGenStartLine: genStartLine: startLine: PUT /cgi/thisistheuploadcgiscript.pl HTTP/1.1 --genStartLine --httpRequestGenStartLine addCookies: Not auto-adding cookies. sendCookies: 1 cookieDir: --addCookies genMultipartFormData: requestParam: name: 999997 filename: C:\This\is\a\valid\path\to\the\file.txt --requestParam requestParam: name: customer_id --requestParam --genMultipartFormData --generateRequest fullHttpRequest: domain: www.myhostname.com port: 443 ssl: 1 openHttpConnection: Opening connection directly to HTTP server. httpHostname: www.myhostname.com httpPort: 443 ssl: 1 HTTPS secure channel established. --openHttpConnection connectTime: Elapsed time: 312 millisec sendRequestHeader: sendHeaderElapsedMs: 0 --sendRequestHeader sendRequestBody: genMultipartFormData: requestParam: name: 999997 filename: C:\This\is\a\valid\path\to\the\file.txt --requestParam requestParam: name: customer_id --requestParam --genMultipartFormData sendBodyElapsedMs: 0 --sendRequestBody statusCode: 200 statusText: OK readResponseBody: Response is chunked. --readResponseBody --fullHttpRequest success: 1 --a_synchronousRequest success: 1 --fullRequest totalTime: Elapsed time: 1125 millisec Success. --SynchronousRequest --ChilkatLog
In perl cgi I read the params like this:
my $query = new CGI; my $filename = $query->param("name"); my $cust = $query->param("customer_id");Like said: Using a browser I get values, using ChilkatHttp, these Params are empty ""
When you test with the browser, using the HTML form as shown above, you are sending a POST where the HTTP request is multipart/form-data.
In your code using Chilkat, you're setting the request.HttpVerb = "PUT". You should be using a "POST". The remainder of your code seems OK. You can examine the exact HTTP request sent by Chilkat by setting the Http.SessionLogFilename property so that the exact HTTP request is logged to a file. See http://stackoverflow.com/questions/4238809/example-of-multipart-form-data for an example of a multipart/form-data request.
Thanks a lot! That was it... I feel so silly that in the end it was a simple typo...