2011-11-19 7 views
5

Bardzo dziwny (dla mnie) problem podczas przesyłania plików na serwer przy użyciu ASIFormDataRequest.ASIHTTPRequest: (potencjalnie) specyficzny dla operatora problem podczas przesyłania danych/serwera otrzymuje pusty POST

Przesyłając przez Wi-Fi, nie ma problemu, mogę przesłać dobrze. Podczas przesyłania przez 3G za pomocą O2 UK jako operatora, nie ma problemu. Kiedy wysyłam używając tego samego kodu na tym samym serwerze przy użyciu Vodafone UK, żądanie HTTP dociera do serwera z usuniętą treścią POST. Jeśli spróbuję tego samego żądania, ale bez przesłania obrazu (po prostu dodaj test => tak jako niektóre dane POST), to zadziała, ale jeśli mam test => tak i załączam plik, dociera on do serwera z POST dane zostały usunięte.

NB Używam najnowszej wersji ASIHTTPRequest na iPhone 4S, i jest odtwarzalna na kilku innych telefonach przy użyciu różnych Vodafone UK i O2 UK.

Tak, jestem wskazując mój kod objc w poniższym skrypcie PHP, który po prostu drukuje co otrzymali:

<?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.'); 

Kod objc używam to:

- (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]); 
} 

Jeśli uruchomić aplikację z WiFi włączone, albo na O2 UK, mam następującą odpowiedź:

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. 

Jak dotąd tak dobrze!

Gdybym ponownie z WiFi wyłączone, ale z prawie pełnego sygnału 3G Vodafone UK:

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

Bardzo dziwne: nie tylko jest plik teraz brakuje, ale „test” wartość post jest również brakujący. Jednak nie ma błędów z PHP lub ASIHTTPRequest.

Czy ktoś może rzucić dla mnie jakieś światło? Jeśli Vodafone manipuluje takimi rzeczami, dlaczego nie jest bardziej znany? Jedyną inną osobą, którą mogę znaleźć, zgłaszającą podobny problem, jest posted a year ago.

Gdybym zakomentuj [Request AddData] linię, to działa idealnie:

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

bardzo dziwne. Próbowałem zrobić to cały dzień, ale bez powodzenia. Byłbym bardzo wdzięczny, gdyby ktoś mógł rzucić jakiekolwiek światło, a nawet miałby ten sam problem.

Odpowiedz

6

Wow. To szalone. To brzmi jak zepsuty serwer proxy HTTP dla mnie. Czy istnieje szansa, że ​​użyjesz protokołu HTTPS, aby uniemożliwić serwerowi proxy manipulowanie danymi?

Możesz również spróbować zdefiniować DEBUG_REQUEST_STATUS (używany w ASIHTTPRequest.m), aby sprawdzić, czy na przykład otrzymujesz przekierowanie, które zrzuca ciało POST lub coś podobnego.

+0

O człowieku. Oto odpowiedź przy użyciu protokołu HTTPS: 'Sukces Odpowiedź: Pliki: Array ( [zdjęcia] => Array ( [name] => smalltestimage.png [type] => image/png [tmp_name] =>/tmp/phpzzo5xF [błąd] => 0 [size] => 13211 ) ) POST: Array ( [test] => Tak ) GET: Array ( ) zrobić. ' Więc to działa na HTTPS, i myślę, że to jest jakoś powiązane. Bardzo dziwne !! Czy Vodafone ma ku temu powód? –

+0

Nie ma pojęcia. To naprawdę brzmi, jakby to był uszkodzony serwer proxy HTTP, który skonfigurowali. Mam nadzieję, że pomogło! –

+0

Awansuj. Pozdrawiam :) –

2

Wiadomo, że wielu operatorów telefonii komórkowej ma proxy, które mogą przerwać działanie w określonych sytuacjach.

W dawnych czasach (powiedzmy, około 2002) prawie każdy przewoźnik miał proxy, który stosowałby bardzo silną kompresję stratną do większości obrazów, a czasami także kompresował javascript/html/css - chodziło o to, aby spróbować stworzyć sieć do wykorzystania na połączeniach GPRS. Było to prawie zawsze implementowane jako przezroczysty serwer proxy HTTP.

W przypadku vodafone w Wielkiej Brytanii (i uważam, że większość przewoźników, którzy to robią), zazwyczaj mają one jeden APN, który ma takie zachowanie, a który nie. Na Vodafone wierzę, że VPN "wap" ma kompresję, ale "web" nie - ale minęło trochę czasu, odkąd musiałem sobie z tym poradzić, więc mogę się pomylić i/lub może się zmienić od tego czasu. Czasami zachowują się też inaczej na połączeniach 3G i GPRS.

Oczywiście, nic z tego nie wyjaśnia, dlaczego upuszcza obraz, który przesyłasz, co nie ma żadnego sensu, ponieważ nie pozwoli zaoszczędzić przepustowości po stronie GPRS/3G. Być może w jakiś sposób uruchamiasz błąd w proxy. Przesyłanie plików png z telefonu komórkowego jest prawdopodobnie nieco niezwykłe, co może wyjaśniać, dlaczego nie ma więcej zgłoszeń problemów - założę się, że 99,9% obrazów przesyłanych z telefonu komórkowego to jpeg.

Używanie https, jak już sugerował Jesse, jest dobrym rozwiązaniem. Ponieważ obrazy są jedną z rzeczy, które zwykle wywołują serwery proxy, nie oznaczanie typu zawartości jako obrazu/png może pomóc, ale nie jestem pewien, czy naprawdę można to polecić.

+1

+1 Staraj się, aby usłyszeć więcej o tle. –

+1

+1 To fantastyczna odpowiedź, dziękuję. W punkcie PNG początkowo wystąpił problem, gdy korzystałem z następującego kodu, który nie ustawiał typu mimi na żądanie (AFAIK): '[request setFile: filepath forKey: [imageToUpload objectForKey: @" unique "] ];' –

+0

Edycja: Właśnie przetestowałem to i znalazłem, że to wciąż dzieje się przy ustawianiu jpg jako 'image/jpg' –

Powiązane problemy