2011-11-19 14 views
5

Problema molto strano (per me) durante il caricamento di file su un server utilizzando ASIFormDataRequest.ASIHTTPRequest: un problema (potenzialmente) specifico dell'operatore durante il caricamento di dati/server riceve vuoto POST

Durante il caricamento tramite WiFi, non ci sono problemi, posso caricare bene. Quando si carica su 3G utilizzando O2 UK come vettore, non ci sono problemi neanche. Quando effettuo il caricamento utilizzando lo stesso identico codice dello stesso server che utilizza Vodafone UK, la richiesta HTTP arriva al server con i contenuti POST eliminati. Se provo la stessa richiesta ma senza caricare un'immagine (aggiungo test => sì come alcuni dati POST), allora funzionerà, ma se ho test => yes e allego un file, arriva al server con il POST dati spogliati.

NB Sto utilizzando l'ultima versione di ASIHTTPRequest su un iPhone 4S ed è riproducibile su diversi altri telefoni che utilizzano Vodafone UK e O2 UK in modo diverso.

Quindi, sto puntando il mio codice objc al seguente script PHP, che stampa solo quali è ricevuto:

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

Il codice objc sto usando è:

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

Se faccio funzionare l'app con WiFi abilitato, o su O2 UK, ottengo la seguente risposta:

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. 

Fin qui tutto bene!

Se riprovo con WiFi disattivato, ma con il segnale quasi piena 3G su Vodafone UK:

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

Molto strano: non solo è il file ora manca, ma il valore POST 'test' è anche mancante. Tuttavia, nessun errore da PHP o ASIHTTPRequest.

Qualcuno può far luce per me? Se Vodafone sta manipolando cose del genere, perché non è più noto? L'unica altra persona che posso trovare riporta un problema simile posted a year ago.

Se commento fuori il [richiesta AddData] linea, allora funziona perfettamente:

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

Molto strano. Ho cercato di farlo funzionare tutto il giorno, ma finora non ho avuto fortuna. Sarei molto grato se qualcuno potesse gettare luce, o anche solo avere lo stesso problema.

risposta

6

Wow. Questo è pazzesco. Mi sembra un proxy HTTP spezzato. Qualche possibilità che tu possa utilizzare HTTPS per cercare di impedire al proxy di interferire con i tuoi dati?

Si potrebbe anche provare a definire DEBUG_REQUEST_STATUS (utilizzato in ASIHTTPRequest.m) per vedere se, ad esempio, si sta ricevendo un reindirizzamento che sta rilasciando il proprio corpo POST o qualcosa del genere.

+0

Oh uomo. Ecco la risposta quando si utilizza HTTPS: 'Successo di risposta: FILES: Array ( [foto] => Array ( [name] => smalltestimage.png [type] => image/png [tmp_name] =>/tmp/phpzzo5xF [errore] => 0 [size] => 13211 ) ) POST: Array ( [test] => Si ) GET: Array ( ) fatto. ' Quindi funziona su HTTPS e suppongo che sia in qualche modo correlato. Molto strano!! Vodafone avrebbe una ragione per farlo? –

+0

Nessun indizio. Sembra proprio che sia un proxy HTTP spezzato che hanno impostato. Spero che questo abbia aiutato! –

+0

Voto positivo. Saluti :) –

2

È noto che un numero di operatori di telefonia mobile dispone di proxy che spezzano le cose in determinate situazioni.

Nei vecchi tempi (diciamo, circa 2002), quasi tutti i carrier avevano un proxy che applicava una compressione lossy molto grave alla maggior parte delle immagini e talvolta comprimeva anche javascript/html/css - l'idea era di provare e fare il web utilizzabile su connessioni GPRS. Questo è stato quasi sempre implementato come proxy http trasparente.

Nel caso di vodafone UK (e credo che la maggior parte dei corrieri lo facciano) in genere hanno un APN con questo comportamento e uno che non lo fa. Su Vodafone, credo che la VPN 'wap' abbia il comportamento di compressione, ma quello 'web' non lo fa, ma è passato un po 'di tempo da quando ho dovuto occuparmi di questo, quindi potrei essere un misremember e/o potrebbe essere cambiato da allora. A volte si comportano diversamente anche su connessioni 3G rispetto a quelle GPRS.

Ovviamente, nulla di tutto ciò spiega il motivo per cui l'immagine che si sta scaricando viene rilasciata, che non ha alcun senso in quanto non consente di risparmiare larghezza di banda sul lato GPRS/3G. Potrebbe essere che tu stia innescando in qualche modo un bug nel proxy. Il caricamento di png da un telefono cellulare è probabilmente un po 'insolito, il che potrebbe spiegare perché non ci sono più segnalazioni di problemi - Scommetto che il 99,9% dei caricamenti di immagini da un telefono cellulare sono jpeg.

L'utilizzo di https, come già suggerito da Jesse, rappresenta una buona soluzione. Poiché le immagini sono una delle cose che i proxy tendono a innescare, non codificare il tipo di contenuto come immagine/png potrebbe essere d'aiuto, ma non sono sicuro che possa davvero essere raccomandato.

+1

+1 Ordinato di saperne di più sullo sfondo. –

+1

+1 Questa è una risposta fantastica, grazie. Nel punto PNG, originariamente ho riscontrato il problema quando stavo usando il seguente codice, che non stava impostando il tipo mimi sulla richiesta (AFAIK): setFile: filepath forKey: [imageToUpload objectForKey: @ " unique "] ]; –

+0

Edit: l'ho appena testato e ho scoperto che sta ancora accadendo quando si imposta jpg come' image/jpg' –

Problemi correlati