2009-04-13 20 views
0

我剛剛寫了一個簡單的Web服務,用於顯示包含單個「文件」類型上傳字段和單個提交按鈕的Web表單。我製作了這個簡單的網頁,目的是讓人們可以使用它,並且在不同機器上的腳本也可以以編程方式執行它。我已經完成了所有人工部分的測試,現在我意識到我不知道如何在第二臺機器上構建一個URL,以便在第一臺機器上成功執行此cgi腳本(並從第二臺機器上傳文件到第一臺機器)。如何以編程方式執行包含「文件」類型上傳輸入字段的CGI腳本表單?

我確實有構建包含表單字段的URL的經驗,但從未使用過「file」類型的上傳輸入字段,所以我正在爲此苦苦掙扎。也許我錯了。

如果我的簡單Web服務是一個名爲「myscript.pl」的cgi-bin腳本,並且文件上傳字段被稱爲「uploadthis」,並且我想要以編程方式上傳的第二臺機器上的文件位於「 C:\ myfile.txt「,那麼我不應該只能在」http://machine1/cgi-bin/myscript.pl?uploadthis=C:\ myfile.txt「形式的第二臺機器上的腳本中構建一個URL,並且該文件會以編程方式上傳,就好像一個人有手動點擊Web表單上的瀏覽按鈕並選擇該文件並點擊提交按鈕?

當我在第一臺機器上彈出cgi腳本表單並瀏覽到該文件並單擊提交時,它可以正常工作。該文件似乎被網頁瀏覽器上傳得很好。但是當我在瀏覽器中輸入上面的URL來手動測試文件上傳URL時,我將該URL編程到另一臺機器上的腳本中,上傳的文件是一個長度爲零的文件。它創建一個文件,但它是完全空的。如果我使用已知的錯誤文件名,例如「http://machine1/cgi-bin/myscript.pl?uploadthis=C:\ myfilethatdoesntexist.txt」,則結果相同。我究竟做錯了什麼?

我想用Apache 2.2和ActivePerl 5.10.0在幾臺Windows XP PC上完成這個任務,表單方法是「post」。

回答

0

短語「multipart/form-data」是我完全錯過的東西。當我谷歌那句話時,我找到了答案。

類似的東西下面這個例子是我如何解決我的問題,從一個Perl腳本:

use HTTP::Request::Common; 
use LWP::UserAgent; 

$ua = LWP::UserAgent->new; 

my $response = $ua->request(
    POST 'http://machine1/cgi-bin/myscript.pl', 
    Content_Type => 'form-data', 
    Content  => [ 
         uploadthis => ["C:\myfile.txt"], 
        ] 
    ); 

if ($response->is_success) { 
    print "Success."; 
} 
else { 
    print "Failure."; 
} 
1

首先,post參數不會在URL的末尾結束。另外,不可能通過瀏覽器完全自動地發送文件上傳(甚至不能使用JavaScript),只是爲了防止用戶上傳驅動器。

如果您想要從瀏覽器上傳,您必須始終選擇文件或在文本框中鍵入文件名,或手動點擊提交按鈕。如果所有這些都是自動的,那麼文件將不會被上傳。

以編程測試文件上傳,您可以捲曲使用:

curl -F "[email protected]:\myfile.txt" http://machine1/cgi-bin/myscript.pl 

當然,你可以寫一個程序,職位作爲文件的multipart/form-data的爲好。

相關問題