Ошибка HttpURLConnection на Android

( Решено – см. Комментарий ниже )

У меня есть класс, который реализует многостраничную загрузку файла. Код работает на каждом java-клиенте, который я пробовал, кроме Android, и это единственный код HTTP-запроса в моем приложении для Android, который не играет хорошо с моей задней службой.

Код response connection – «-1», поэтому здесь происходит что-то довольно неприятное. В журналах доступа или ошибок Apache не отображаются записи, похоже, что запрос никогда не удаляет его из платформы Android. Код получает право на запись соединения, но зависает в соединении, считывает, время и затем возвращается. Поведение одинаково для реального телефона и эмулятора.

Кто-нибудь знает о каких-либо ошибках, которые нужно учитывать при публикации многопользовательского файла в Android?

Я включаю в себя класс ниже (мелкие гигиенические моды сделаны), чтобы вы могли видеть, что я делаю

import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; public class GeoPictureUploader { static String serviceDomain = "http://staging.abaqus.net"; static String postUrl = serviceDomain + "/geo/upl/wupload/pictures"; static String CRLF = "\r\n"; static String twoHyphens = "--"; static String boundary = "*****mgd*****"; private String pictureFileName = null; private String name = null; private String password = null; private DataOutputStream dataStream = null; enum ReturnCode { noPicture, unknown, http201, http400, http401, http403, http404, http500}; public GeoPictureUploader(String name, String password) { this.name = name; this.password = password; } public static void setServiceDomain(String domainName) { serviceDomain = domainName; } public static String getServiceDomain() { return serviceDomain; } public ReturnCode uploadPicture(String pictureFileName) { this.pictureFileName = pictureFileName; File uploadFile = new File(pictureFileName); if (uploadFile.exists()) try { FileInputStream fileInputStream = new FileInputStream(uploadFile); URL connectURL = new URL(postUrl); HttpURLConnection conn = (HttpURLConnection)connectURL.openConnection(); conn.setDoInput(true); conn.setDoOutput(true); conn.setUseCaches(false); conn.setRequestMethod("POST"); conn.setRequestProperty("User-Agent", "myGeodiary-V1"); conn.setRequestProperty("Connection","Keep-Alive"); conn.setRequestProperty("Content-Type","multipart/form-data;boundary="+boundary); conn.connect(); dataStream = new DataOutputStream(conn.getOutputStream()); writeFormField("login", name); writeFormField("password", password); writeFileField("photo1", pictureFileName, "image/jpg", fileInputStream); // final closing boundary line dataStream.writeBytes(twoHyphens + boundary + twoHyphens + CRLF); fileInputStream.close(); dataStream.flush(); dataStream.close(); dataStream = null; String response = getResponse(conn); int responseCode = conn.getResponseCode(); if (response.contains("uploaded successfully")) return ReturnCode.http201; else // for now assume bad name/password return ReturnCode.http401; } catch (MalformedURLException mue) { // Log.e(Tag, "error: " + mue.getMessage(), mue); System.out.println("GeoPictureUploader.uploadPicture: Malformed URL: " + mue.getMessage()); return ReturnCode.http400; } catch (IOException ioe) { // Log.e(Tag, "error: " + ioe.getMessage(), ioe); System.out.println("GeoPictureUploader.uploadPicture: IOE: " + ioe.getMessage()); return ReturnCode.http500; } catch (Exception e) { // Log.e(Tag, "error: " + ioe.getMessage(), ioe); System.out.println("GeoPictureUploader.uploadPicture: unknown: " + e.getMessage()); return ReturnCode.unknown; } else { return ReturnCode.noPicture; } } /** * @param conn * @return */ private String getResponse(HttpURLConnection conn) { try { DataInputStream dis = new DataInputStream(conn.getInputStream()); byte [] data = new byte[1024]; int len = dis.read(data, 0, 1024); dis.close(); int responseCode = conn.getResponseCode(); if (len > 0) return new String(data, 0, len); else return ""; } catch(Exception e) { System.out.println("GeoPictureUploader: biffed it getting HTTPResponse"); //Log.e(TAG, "GeoPictureUploader: biffed it getting HTTPResponse"); return ""; } } /** * this mode of reading response no good either */ private String getResponseOrig(HttpURLConnection conn) { InputStream is = null; try { is = conn.getInputStream(); // scoop up the reply from the server int ch; StringBuffer sb = new StringBuffer(); while( ( ch = is.read() ) != -1 ) { sb.append( (char)ch ); } return sb.toString(); // TODO Auto-generated method stub } catch(Exception e) { System.out.println("GeoPictureUploader: biffed it getting HTTPResponse"); //Log.e(TAG, "GeoPictureUploader: biffed it getting HTTPResponse"); } finally { try { if (is != null) is.close(); } catch (Exception e) {} } return ""; } /** * write one form field to dataSream * @param fieldName * @param fieldValue */ private void writeFormField(String fieldName, String fieldValue) { try { dataStream.writeBytes(twoHyphens + boundary + CRLF); dataStream.writeBytes("Content-Disposition: form-data; name=\"" + fieldName + "\"" + CRLF); dataStream.writeBytes(CRLF); dataStream.writeBytes(fieldValue); dataStream.writeBytes(CRLF); } catch(Exception e) { System.out.println("GeoPictureUploader.writeFormField: got: " + e.getMessage()); //Log.e(TAG, "GeoPictureUploader.writeFormField: got: " + e.getMessage()); } } /** * write one file field to dataSream * @param fieldName - name of file field * @param fieldValue - file name * @param type - mime type * @param fileInputStream - stream of bytes that get sent up */ private void writeFileField( String fieldName, String fieldValue, String type, FileInputStream fis) { try { // opening boundary line dataStream.writeBytes(twoHyphens + boundary + CRLF); dataStream.writeBytes("Content-Disposition: form-data; name=\"" + fieldName + "\";filename=\"" + fieldValue + "\"" + CRLF); dataStream.writeBytes("Content-Type: " + type + CRLF); dataStream.writeBytes(CRLF); // create a buffer of maximum size int bytesAvailable = fis.available(); int maxBufferSize = 1024; int bufferSize = Math.min(bytesAvailable, maxBufferSize); byte[] buffer = new byte[bufferSize]; // read file and write it into form... int bytesRead = fis.read(buffer, 0, bufferSize); while (bytesRead > 0) { dataStream.write(buffer, 0, bufferSize); bytesAvailable = fis.available(); bufferSize = Math.min(bytesAvailable, maxBufferSize); bytesRead = fis.read(buffer, 0, bufferSize); } // closing CRLF dataStream.writeBytes(CRLF); } catch(Exception e) { System.out.println("GeoPictureUploader.writeFormField: got: " + e.getMessage()); //Log.e(TAG, "GeoPictureUploader.writeFormField: got: " + e.getMessage()); } } /** * @param args */ public static void main(String[] args) { if (args.length >= 0) { GeoPictureUploader gpu = new GeoPictureUploader("john", "notmyrealpassword"); String picName = args[0]; ReturnCode rc = gpu.uploadPicture(picName); System.out.printf("done"); } } } 

Solutions Collecting From Web of "Ошибка HttpURLConnection на Android"

Установили ли вы разрешение на интернет? Я попытался бы убедиться, что Simple Gets (используйте HTTPUrl для извлечения google), прежде чем пытаться отлаживать сообщение.

HI я сделал загрузку файлов с использованием того же HttpURLConnection. Я могу загружать файлы до 25 мб для отдыхающих сервисов. Посмотрите, это может быть полезно для вас: link