Je fais des demandes postales dans mon application et sur SOMTimes (si j'ai une énorme quantité de données post), l'erreur suivante s'est produite:
Avax.net.ssl.sSlexception: Erreur d'écriture: SSL = 0x2f0610: E / S Erreur lors de l'appel système, Tuyau cassé P> blockQuote>
en exécutant http.execute (httpost) dans le code ci-dessous. Est-ce que quelqu'un sait comment éviter cela? P>
J'ai essayé d'utiliser Androidhttpclient, mais je ne trouve pas de manière valide pour l'authentification de base Et j'ai essayé une httppsurlconnection, mais obtenez la même erreur. P>
public static boolean upload_image2(String url, List<NameValuePair> nameValuePairs, File file, String encoding) { boolean erg = false; HttpParams httpParams = new BasicHttpParams(); int connection_Timeout = 120000; HttpConnectionParams.setConnectionTimeout(httpParams,connection_Timeout); HttpConnectionParams.setSoTimeout(httpParams, connection_Timeout); http = new DefaultHttpClient(httpParams); HttpResponse res; UsernamePasswordCredentials c = new UsernamePasswordCredentials(username, password); BasicCredentialsProvider cP = new BasicCredentialsProvider(); cP.setCredentials(AuthScope.ANY, c); try { HttpPost httpost = new HttpPost(url); MultipartEntity entity = new MultipartEntity( HttpMultipartMode.STRICT); FileBody isb = new FileBody(file, "application/*"); entity.addPart("File", isb); for (int index = 0; index < nameValuePairs.size(); index++) { ContentBody cb; // Normal string data cb = new StringBody(nameValuePairs.get(index).getValue(), "", null); entity.addPart(nameValuePairs.get(index).getName(), cb); } httpost.setEntity(entity); res = http.execute(httpost); InputStream is = res.getEntity().getContent(); BufferedInputStream bis = new BufferedInputStream(is); ByteArrayBuffer baf = new ByteArrayBuffer(50); int current = 0; while ((current = bis.read()) != -1) { baf.append((byte) current); } res = null; httpost = null; String ret = new String(baf.toByteArray(), encoding); LastError = ret; erg = true; } catch (ClientProtocolException e) { // TODO Auto-generated catch block LastError = e.getMessage(); erg = false; } catch (IOException e) { // TODO Auto-generated catch block LastError = e.getMessage(); erg = false; } return erg; }
3 Réponses :
Je n'ai pas pu résoudre le problème avec DefaulthttpClient, AndroidhttpClient ou Résumé, mais j'ai finalement trouvé une solution avec authentification HttpSurlrequest ANT via l'en-tête au lieu de Credentielsservice:
public static boolean upload_image5(String urls,File file, String encoding){
HttpURLConnection connection = null;
DataOutputStream outputStream = null;
DataInputStream inputStream = null;
String myfilename = file.getName();
String urlServer = urls;
String lineEnd = "\r\n";
String twoHyphens = "--";
String boundary = "*****";
boolean erg = false;
int bytesRead, bytesAvailable, bufferSize;
byte[] buffer;
int maxBufferSize = 1*1024*1024;
try
{
FileInputStream fileInputStream = new FileInputStream(file);
URL url = new URL(urlServer);
connection = (HttpsURLConnection) url.openConnection();
// Allow Inputs & Outputs
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setUseCaches(false);
// Enable POST method
connection.setRequestMethod("POST");
connection.setRequestProperty("Connection", "Keep-Alive");
connection.setRequestProperty("Content-Type", "multipart/form-data;boundary="+boundary);
connection.addRequestProperty("Authorization","Basic [YOUR MD5 LOGIN VALUE]");
outputStream = new DataOutputStream( connection.getOutputStream() );
outputStream.writeBytes(twoHyphens + boundary + lineEnd);
outputStream.writeBytes("Content-Disposition: form-data; name=\"DestFileName\"");
outputStream.writeBytes(lineEnd);
outputStream.writeBytes(lineEnd);
outputStream.writeBytes(myfilename);
outputStream.writeBytes(lineEnd);
outputStream.writeBytes(twoHyphens + boundary + lineEnd);
outputStream.writeBytes("Content-Disposition: form-data; name=\"Target\"" );
outputStream.writeBytes(lineEnd);
outputStream.writeBytes(lineEnd);
outputStream.writeBytes("DOC");
outputStream.writeBytes(lineEnd);
outputStream.writeBytes(twoHyphens + boundary + lineEnd);
outputStream.writeBytes("Content-Disposition: form-data; name=\"filename\"");
outputStream.writeBytes(lineEnd);
outputStream.writeBytes(lineEnd);
outputStream.writeBytes(myfilename);
outputStream.writeBytes(lineEnd);
outputStream.writeBytes(twoHyphens + boundary + lineEnd);
outputStream.writeBytes("Content-Disposition: form-data; name=\"File\"; filename=\"" + myfilename + "\"");
outputStream.writeBytes(lineEnd);
outputStream.writeBytes("Content-Type: application/*");
outputStream.writeBytes(lineEnd);
outputStream.writeBytes(lineEnd);
//hier File schreiben
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
buffer = new byte[bufferSize];
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
while (bytesRead > 0)
{
outputStream.write(buffer, 0, bufferSize);
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
}
outputStream.writeBytes(lineEnd);
outputStream.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
fileInputStream.close();
try {
inputStream = new DataInputStream(connection.getInputStream());
StringBuilder response = new StringBuilder();
String line;
while ((line = inputStream.readLine()) != null) {
response.append(line).append('\n');
}
LastError =response.toString();
erg = true;
} catch (IOException e) {
LastError = e.getMessage();
erg = false;
} finally {
if (inputStream != null){
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
outputStream.flush();
outputStream.close();
}
catch (Exception ex)
{
LastError = ex.getMessage();
erg = false;
}
return erg;
}
J'avais la même erreur. Le problème est dans la bibliothèque Android où l'utilisation de DefaulthttpClient existe depuis que Android API Niveau 1 et AndroidhttpClient est disponible depuis Android API Niveau 8. Ceci est un bogue dans Android https://code.google.com/p/android/issues/detail?id=8625 p>
Mon problème était:
Le délai d'attente J'ai résolu mon problème de problème de problème de problème de réglage de la connexion HTTP sur les 5 minutes ou une valeur de quelque chose dépasse 60 secondes. Si je peux recommander comment résoudre votre problème exécuté sur le serveur Wireshark et écoute la communication avec le périphérique mobile. P>
J'ai eu le même problème à l'aide de la défaulttpclient, eh bien, en utilisant ma propre implémentation du httpClient pour prendre en charge HTTPS. Les petits fichiers que cela fonctionnait bien et que de gros fichiers ont échoué le temps après la période. p>
Après avoir lu cette réponse, j'ai changé à l'adresse httppsurlconnection comme la réponse acceptée suggère et aussi parce qu'elle est recommandée par Android ( http://android-developers.blogspot.pt/2011/09/Androids-http-clients.html ). p>
Le problème se tenait. Il s'agit du problème sur le serveur, j'ai modifié les configurations du serveur PHP avant d'accepter de plus grandes tailles, mais j'ai totalement oublié de modifier le client_max_body_size code> du nginx. Après avoir fait que la petite modification, envoyer de gros fichiers fonctionnait. À la fois httppsurlconnections et défaulttpclient. P>
Voir Stackoverflow.com/Questions/2899079/...
thx, mais déjà essayé, même erreur. J'utilise un proxy pour la demande, mais dans mon application WM ne fonctionnant pas sans erreurs, vous devez dépendre du système Android.
Parfois, cela se produit en raison du problème de la connectivité Internet. Je suis aussi face à cela.