我想擴展名爲SimpleURLConnections的示例ios代碼。此示例代碼可以使用HTTP POST上傳文件。我使用Perl編寫的cgi腳本啓用了我的apache web服務器,以接收解決cgi腳本併成功上傳文件的HTTP POST。我想要做的擴展是添加上傳文件的標題或描述。我試圖更新示例代碼中的多部分表單數據,並對我的cgi腳本進行相應更改以傳輸此描述,但它失敗。 cgi腳本無法使用名爲param()的cgi.pm方法讀取描述。我希望有人能幫忙。下面是詳細信息:如何擴展IOS SimpleURLConnections HTTP POST發送描述可由CGI解碼Perl
的多格式數據之前我修改如下所示(注:SimpleURLConnections常規嵌入式Content-Type和上飛的第二個邊界之間的圖像文件):
--Boundary-D4AFFBA9-AD92-4697-9184-7BDA128C3B97
Content-Disposition: form-data; name="fileContents"; filename="1234567/TestImage1.png"
Content-Type: image/png
--Boundary-D4AFFBA9-AD92-4697-9184-7BDA128C3B97
Content-Disposition: form-data; name="uploadButton"
Upload File
--Boundary-D4AFFBA9-AD92-4697-9184-7BDA128C3B97--
的多形式的數據後,我的修改如下所示:
--Boundary-D4AFFBA9-AD92-4697-9184-7BDA128C3B97
Content-Disposition: form-data; name="Title"; title="Hello World"
Content-Type: text/plain
--Boundary-D4AFFBA9-AD92-4697-9184-7BDA128C3B97
Content-Disposition: form-data; name="fileContents"; filename="1234567/TestImage1.png"
Content-Type: image/png
--Boundary-D4AFFBA9-AD92-4697-9184-7BDA128C3B97
Content-Disposition: form-data; name="titleButton"
my Title
--Boundary-D4AFFBA9-AD92-4697-9184-7BDA128C3B97
Content-Disposition: form-data; name="uploadButton"
Upload File
--Boundary-D4AFFBA9-AD92-4697-9184-7BDA128C3B97--
我的CGI腳本如下所示:
#!/usr/bin/perl -wT
use strict;use CGI;
use CGI::Carp qw (fatalsToBrowser);
use File::Basename;
my $upload_dir = "/Library/WebServer/Documents/upload";
my $query = new CGI;
my $title = $query->param("Title");
#if (!$title) {
# die "the title is $title. $!";
#}
if (!$filename) {
print $query->header ();
die "There was a problem uploading your photo (try a smaller file). : $!";
exit;
}
...
open (UPLOADFILE, ">$upload_dir/$filename") or die "$!";
while (<$upload_filehandle>) {
print UPLOADFILE;
}
close UPLOADFILE;
此代碼正常工作,上傳的文件被寫入upload_dir。
但是,如果我取消註釋的代碼有點堵:
if (!$title) {
die "the title is $title. $!";
}
的腳本以表明$標題沒有值的誤差死亡:
[Tue Sep 27 17:09:17 2011] [error] [client 10.0.1.2] [Tue Sep 27 17:09:17 2011] upload.cgi: Use of uninitialized value $title in print at /Library/WebServer/CGI-Executables/upload.cgi line 79.
因此,與問題我的多部分表單數據,cgi腳本,還是不可能在多部分表單數據中傳遞這些數據?有其他方法嗎?
感謝
好了,從@ AFresh1得到幫助後,我發現這個問題。問題在於如何創建多部分表單數據。首先,我將展示錯誤的方式。
NSString *title = @"Hello World";
bodySuffixStr = [NSString stringWithFormat: // create the footer for the POST message
@
"\r\n"
"--%@\r\n"
"Content-Disposition: form-data; name=\"titleButton\"\r\n"
"%@\r\n\r\n"
"--%@\r\n"
"Content-Disposition: form-data; name=\"uploadButton\"\r\n"
"\r\n"
"Upload File\r\n"
"--%@--\r\n"
"\r\n",
boundaryStr,
title,
boundaryStr,
boundaryStr
];
現在正確的方式(在第7行一個非常微妙的變化 - 移動的CR/LF):
NSString *title = @"Hello World";
bodySuffixStr = [NSString stringWithFormat: // create the footer for the POST message
@
"\r\n"
"--%@\r\n"
"Content-Disposition: form-data; name=\"titleButton\"\r\n"
"\r\n%@\r\n"
"--%@\r\n"
"Content-Disposition: form-data; name=\"uploadButton\"\r\n"
"\r\n"
"Upload File\r\n"
"--%@--\r\n"
"\r\n",
boundaryStr,
title,
boundaryStr,
boundaryStr
];
沒有,對不起。如果我理解了你建議的改變,那似乎不起作用。 – JeffB6688
我相信它應該可以工作,在我的測試中它可以。你可以嘗試使用原始工作代碼(沒有添加),看看你是否可以獲得'$ query - >('titleButton')'的值? – AFresh1
好的,所以我誤解了你建議改變的地方。我已經做出了改變,但它仍然不起作用(儘管錯誤稍有不同。首先,爲了清楚起見,這裏是改變的多部分表格數據: – JeffB6688