2011-09-27 63 views
0

我想擴展名爲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 
     ]; 

回答

1

我相信內容雲在空間的頭 後和前下一個邊界不在標題屬性中。部分頭部是邊界之後和空行之前的所有內容。

如果你想使用$query->param('Title')得到的「Hello World」到$標題我想你會需要更多的東西像這樣(注意,內容類型默認爲text/plain的):

--Boundary-D4AFFBA9-AD92-4697-9184-7BDA128C3B97 
Content-Disposition: form-data; name="Title" 

Hello World 
--Boundary-D4AFFBA9-AD92-4697-9184-7BDA128C3B97 
+0

沒有,對不起。如果我理解了你建議的改變,那似乎不起作用。 – JeffB6688

+0

我相信它應該可以工作,在我的測試中它可以。你可以嘗試使用原始工作代碼(沒有添加),看看你是否可以獲得'$ query - >('titleButton')'的值? – AFresh1

+0

好的,所以我誤解了你建議改變的地方。我已經做出了改變,但它仍然不起作用(儘管錯誤稍有不同。首先,爲了清楚起見,這裏是改變的多部分表格數據: – JeffB6688