2011-11-19 52 views
5

使用ASIFormDataRequest將文件上傳到服務器時非常奇怪(對我而言)問題。ASIHTTPRequest:上傳數據/服務器時(可能)特定於運營商的問題,收到空白POST

通過WiFi上傳時,沒有問題,我可以上傳就好。使用O2 UK作爲運營商通過3G上傳時,也沒有問題。當我使用完全相同的代碼上傳使用Vodafone UK的相同服務器時,HTTP請求會到達服務器並剝去POST內容。如果我嘗試了同樣的請求,但沒有上傳圖片(只需將test => yes添加爲某些POST數據),那麼這將起作用,但是如果我有test => yes並附加了一個文件,它會通過POST到達服務器數據被剝離。

NB我在iPhone 4S上使用最新版本的ASIHTTPRequest,並且可以在其他幾款使用Vodafone UK和O2 UK的手機上進行重現。

所以,我指着我的objc代碼在下面的PHP腳本,它只是打印出什麼它收到:

<?php 
error_reporting(E_ALL); 
ini_set("display_startup_errors","1"); 
ini_set("display_errors","1"); 

echo "FILES: ".print_r($_FILES,true); 
echo "POST: ".print_r($_POST,true); 
echo "GET: ".print_r($_GET,true); 

die('done.'); 

我使用的objc代碼:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    NSURL *url = [NSURL URLWithString: @"http://myserver.com/debugger.php"]; 
    ASIFormDataRequest *request = [[ASIFormDataRequest alloc] initWithURL:url]; 

    [request setDelegate:self]; 
    [request setDidFinishSelector:@selector(networkRequestSuccess:)]; 
    [request setDidFailSelector:@selector(networkRequestFailure:)]; 
    [request setTimeOutSeconds:120]; 

    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"smalltestimage" ofType:@"png"]; 
    NSData *myData = [NSData dataWithContentsOfFile:filePath]; 
    if (myData) { 
     [request addPostValue:@"Yes" forKey:@"Test"]; 
     [request addData:myData withFileName:@"smalltestimage.png" andContentType:@"image/png" forKey:@"photos"]; 
     [request startSynchronous]; 
    } 
    else{ 
     NSLog(@"File not found.."); 
    } 

    [request autorelease]; 
} 

- (void)networkRequestSuccess:(ASIHTTPRequest *)request{ 

    NSLog(@"Success Response: %@", [request responseString]); 

} 

- (void)networkRequestFailure:(ASIHTTPRequest *)request{ 
    NSLog(@"Fail Response: %@", [request responseString]); 
} 

如果我運行的WiFi應用程序啓用,或者在英國O2,我得到如下回應:

Success Response: FILES: Array 
(
    [photos] => Array 
     (
      [name] => smalltestimage.png 
      [type] => image/png 
      [tmp_name] => /tmp/phpYTdw4g 
      [error] => 0 
      [size] => 13211 
     ) 

) 
POST: Array 
(
    [Test] => Yes 
) 
GET: Array 
(
) 
done. 

到目前爲止好!

如果我試了WiFi禁用,但對英國沃達豐公司幾乎全部的3G信號:

Success Response: FILES: Array 
(
) 
POST: Array 
(
) 
GET: Array 
(
) 
done. 

非常奇怪:不僅是現在,該文件丟失,但「測試」 POST值也失蹤。但是,PHP或ASIHTTPRequest都沒有錯誤。

任何人都可以爲我擺脫任何光線嗎?如果沃達豐正在操縱這樣的東西,爲什麼它不被人們熟知?我唯一能找到的其他人報告類似的問題posted a year ago

如果我註釋掉[請求addData]行,然後它完美的作品:

Success Response: FILES: Array 
(
) 
POST: Array 
(
    [Test] => Yes 
) 
GET: Array 
(
) 
done. 

很奇怪。我一直試圖讓這個工作整天,但沒有運氣到目前爲止。如果有人能夠擺脫任何光線,或者甚至出現同樣的問題,我將非常感激。

回答

6

哇。太瘋狂了。這聽起來像是一個破碎的HTTP代理給我。您有可能使用HTTPS嘗試並防止代理混淆您的數據嗎?

您也可以嘗試定義DEBUG_REQUEST_STATUS(在ASIHTTPRequest.m中使用),以查看是否收到了丟棄POST正文或其他內容的重定向。

+0

哦,夥計。下面是使用HTTPS當響應: '成功響應:FILES:數組 ( [照片] =>數組 ( [名稱] => smalltestimage.png [型] =>圖像/ PNG [tmp_name的值] =>的/ tmp/phpzzo5xF [錯誤] => 0 [尺寸] => 13211 ) ) POST:數組 ( [測試] =>是 ) GET:數組 ( ) 完成。 ' 所以這是通過HTTPS工作,並且我猜想它有某種相關性。很奇怪!!沃達豐是否有這樣做的理由? –

+0

沒有線索。這聽起來好像是一個他們已經設置好的HTTP代理。希望有所幫助! –

+0

Upvote。乾杯:) –

2

衆所周知,許多移動運營商都有在某些情況下破壞事物的代理。

在過去的時代(比如2002年),幾乎每個運營商都有一個代理,它可以對大多數圖像應用非常嚴重的有損壓縮,有時還會壓縮javascript/html/css - 想法是嘗試使網絡可用於GPRS連接。這幾乎總是作爲一個透明的http代理來實現。

在沃達豐英國的情況下(我相信大多數運營商都這樣做),他們通常有一個APN有這種行爲,一個沒有。在沃達豐,我相信'wap'VPN具有壓縮行爲,但'網絡'卻沒有 - 但是這是一段時間,因爲我必須處理這個問題,所以我可能會被誤解和/或從那以後它可能會發生變化。有時候,他們在3G連接和GPRS連接上表現也會有所不同。

當然,這些都不能解釋爲什麼它會丟失上傳的圖像,這根本沒有任何意義,因爲它不會在GPRS/3G端節省任何帶寬。這可能是你以某種方式觸發代理中的錯誤。從手機上傳PNG可能有點不尋常,這可以解釋爲什麼沒有更多的問題報道 - 我敢打賭,從手機上傳圖片的99.9%是jpeg。

使用https,正如傑西已經提出的,是一個很好的解決方法。由於圖片是代理傾向於觸發的內容之一,因此不會將內容類型標記爲image/png可能會有所幫助,但我不確定這是否可以真正推薦。

+1

+1整齊地聽到更多關於背景。 –

+1

+1這是一個非常棒的迴應,謝謝。在PNG點上,當我使用下面的代碼時,我最初遇到了這個問題,它沒有在請求(AFAIK)上設置mimi類型: '[請求 setFile:文件路徑 forKey:[imageToUpload objectForKey:@「獨特的]] ];' –

+0

編輯:我只是測試它,發現它仍然發生時,設置JPG爲'圖像/ jpg' –