ho problemi con il caricamento di immagini in android.HTTP httpclient file upload corruzione dei dati e problemi di timeout
sto usando Apache 4.1 httpmime lib il codice è come questo:
MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
reqEntity.addPart("image", new FileBody(new File(AndorraApplication.getPhotosPath() + "/" + entity.getFileName()), "image/jpeg"));
resp = NetworkUtils.sendHttpRequestMultipart(EXPORT_PHOTOS_URI, reqEntity);
NetworkUtils classe:
public class NetworkUtils {
public static final int REGISTRATION_TIMEOUT = 3 * 1000;
public static final int WAIT_TIMEOUT = 5 * 1000;
public static HttpResponse sendHttpRequestMultipart(String uri, MultipartEntity entity) {
HttpClient mHttpClient = new DefaultHttpClient();
final HttpParams params = mHttpClient.getParams();
HttpConnectionParams.setConnectionTimeout(params, REGISTRATION_TIMEOUT);
HttpConnectionParams.setSoTimeout(params, WAIT_TIMEOUT);
ConnManagerParams.setTimeout(params, WAIT_TIMEOUT);
HttpPost post = new HttpPost(uri);
post.addHeader(entity.getContentType());
post.setEntity(entity);
HttpResponse resp = mHttpClient.execute(post);
}
}
a volte tutto funziona bene, ma a volte (soprattutto su una connessione lenta) l'immagine è stata caricata molto corrotta. l'esempio è qui: http://pixelbirthcloud.com/574_orig.jpg
non presenta eccezioni. la lunghezza del file caricato è uguale a quella originale .. ho provato a cambiare il tipo mime in application/octet-stream o rimuoverlo del tutto. prova a giocare con i timeout. ancora lo stesso risultato. gli utenti finali caricano quasi sempre immagini danneggiate (anche se sono riuscito a ottenere immagini bronz solo 2 volte) .. le dimensioni dell'immagine erano inizialmente di 2,5 mega, ma poi l'ho ridotta a 500-700 kb. non ha risolto il problema però.
non ho provato a cambiare la libreria di apache .. forse è il problema .. ma per quanto ho letto la rete, nessuno lo stava vivendo con la libreria httpmime.
cosa può essere? Sono completamente perso ora :(
l'altra questione è che a volte i timeout non funzionante
come quando si tratta di questa linea:. HttpResponse resp = mHttpClient.execute (post); e ho disattivare il 3G collegamento solo attende come 17-20 minuti invece di 3 o 5 secondi .. e solo poi getta eccezione provato diversi metodi come questo:..
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
HttpProtocolParams.setUseExpectContinue(params, false);
HttpConnectionParams.setConnectionTimeout(params, 10000);
HttpConnectionParams.setSoTimeout(params, 10000);
ConnManagerParams.setMaxTotalConnections(params, 5);
ConnManagerParams.setTimeout(params, 30000);
SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("http",PlainSocketFactory.getSocketFactory(), 80));
registry.register(new Scheme("https",PlainSocketFactory.getSocketFactory(), 80));
ThreadSafeClientConnManager manager = new ThreadSafeClientConnManager(params, registry);
HttpClient httpclient = new DefaultHttpClient(manager, params);
ma ancora non funziona :)
Lo script online che verrà colpito dovrebbe avere il codice per leggere il file e salvarlo sul database – Javanator
potrebbe finire per fare qualcosa del genere credo ... anche se non ha risposto alla domanda, ma grazie .. ha visto tale soluzione in rete prima, ma ha deciso di andare in un modo più conveniente - utilizzando httpcomponents .. ma non è riuscito per qualche motivo :( – Alex
è una classe completa abbiamo solo bisogno di passare l'URL del file e l'url di script. Cosa sarebbe più conveniente quindi questa libreria httpmime – Javanator