私は、org.apache.commons.fileupload APIを使用してCSVファイルをアップロードし、その後、MySQLテーブルにロードする必要があるサーブレットを作成しました。これは、ブラウザのフォームからサーブレットにポストするときには完全に機能します。しかし、Tclスクリプトhttp://www.tcl.tk/man/tcl/TclCmd/http.htm#M20でフォームを投稿しようとすると失敗します。Tclスクリプトからの投稿時のMalformedStreamException
サーブレットは、次のMalformedStreamException
スロー:
org.apache.commons.fileupload.MultipartStream$MalformedStreamException:
Stream ended unexpectedly
サーブレットは、Tomcatのバージョン6.0.16でホストされています。
HTTP/1.1 200 OKレスポンスを受信してサーブレットがいくつかのprint文をクライアントのTclスクリプトに返すため、Tclスクリプトによって接続が成功します。しかし、入力ストリームを読み込もうとすると失敗します。
Tclスクリプト:
package require http
proc upload { url csv } {
set boundary "-----WebKitFormBoundary[clock seconds][pid]"
set fid [open $csv r]
if {[catch {read $fid [file size $csv]} data]} {
return -code error $data
}
close $fid
set content {}
append content "--${boundary}\n"
append content "Content-Disposition: form-data; name=\"db\"\n\n"
append content "test\n"
append content "--${boundary}\n"
append content "Content-Disposition: form-data; name=\"table\"\n\n"
append content "testing\n"
append content "--${boundary}\n"
append content "Content-Disposition: form-data; name=\"file\"; filename=\"$csv\"\n"
append content "Content-Type: text/csv\n\n"
append content "$data\n"
append content "${boundary}--"
set headers "connection keep-alive"
set token [::http::geturl $url -keepalive 1 -headers $headers -query $content -type "multipart/form-data; boundary=$boundary"]
upvar 0 $token state
if {$state(http) == "HTTP/1.1 200 OK"} {
# no error reported in http headers
puts stdout $state(http)
puts stdout $state(body)
return 1
} else {
# error reported in http headers
puts stdout $state(http)
puts stdout $state(body)
return 0
}
}
set csv "data.csv"
set url "http://ecat:8080/MySqlImport/MySqlImportServlet"
set retVal [upload $url $csv]
投稿しているtclコードを投稿できますか?あなたがfileupload APIが期待しているマルチパートリクエストを投稿していない可能性があります。 –
tclスクリプトを追加するように更新しました – Daniel
終了境界は ' - $ {boundary} - \ n'と思ったのですか? –