2017-02-16 7 views
0

У меня есть этот код, который может загрузить файл JPEG на сервер, но файл не распознается как JPEG. Я думаю, что моя проблема заключается в правильной кодировке файла JPEG. Мое решение по существу совпадает с this one. Я пробовал другие варианты добавления байтов JPEG с использованием FileInputStream и с использованием DataOutputStream вместо OutputStreamWriter и т. Д. Безрезультатно. Любое предложение оценили.Загрузка изображений HttpURLConnection Android, но файл не распознан как JPEG

final String boundary = "=================="; 
final String mimeType = "image/jpeg"; 
final int IMAGE_QUALITY = 100; 

URL url = null; 
HttpURLConnection urlConnection = null; 
OutputStreamWriter request = null; 
String response = null; 

try { 
    url = new URL(params[0]); 
    urlConnection = (HttpURLConnection) url.openConnection(); 
    urlConnection.setDoOutput(true); 
    urlConnection.setDoInput(true);  /// 
    urlConnection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary); 
    urlConnection.setRequestMethod("POST"); 

    OutputStream outputStream= urlConnection.getOutputStream(); 

    request = new OutputStreamWriter(outputStream); 
    request.append("--" + boundary).append("\n"); 
    request.append("Content-Disposition: form-data; name=\"file\"; filename=\"" + imageFileName + "\"").append("\n\n"); 
    request.append("Content-Type: " + mimeType).append("\n\n"); 
    request.append("Content-Encoding: base64").append("\n\n"); 

    ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
    imageThumbnail.compress(Bitmap.CompressFormat.JPEG, IMAGE_QUALITY, stream); 
    byte[] byteArray = stream.toByteArray(); 
    //request.append(new String(byteArray)).append("\n"); 
    String encodedImage = Base64.encodeToString(byteArray, Base64.DEFAULT); 
    request.append(encodedImage); 

    request.append("--" + boundary + "--"); 
    request.flush(); 
    request.close(); 

    String line = null; 
    InputStreamReader isr = new InputStreamReader(urlConnection.getInputStream()); 
    BufferedReader reader = new BufferedReader(isr); 
    StringBuilder sb = new StringBuilder(); 
    while ((line = reader.readLine()) != null) { 
     sb.append(line).append("\n"); 
    } 
    response = sb.toString(); // = "Success" 

    isr.close(); 
    reader.close(); 

} catch (MalformedURLException e) { 
    e.printStackTrace(); 
    response = "Malformed URL"; 

} catch (IOException e) { 
    e.printStackTrace(); 
    response = "IO Exception"; 
} 

return response; 
+0

'Я думаю, что моя проблема о кодировании файла correctly.' JPEG. Какая кодировка? И зачем вы его кодируете? Лучше загрузите файл «как есть». – greenapps

+0

'OutputStreamWriter request = null;'. Почему вы вызываете создателя потока потока «запрос»? Таким образом вы пишете код без ошибок. – greenapps

+0

'.append (" \ n \ n ");'. У вас слишком много этих пустых строк. – greenapps

ответ

0

Благодаря this post here, решение выглядит следующим образом:

final String boundary = "=================="; 
final String twoHyphens = "--"; 
final String crlf = "\r\n"; 
final String mimeType = "image/jpeg"; 
final int IMAGE_QUALITY = 100; 

URL url = null; 
HttpURLConnection urlConnection = null; 
DataOutputStream dos; 
String response = null; 

try { 
    url = new URL(params[0]); 
    urlConnection = (HttpURLConnection) url.openConnection(); 
    urlConnection.setDoOutput(true); 
    urlConnection.setDoInput(true);  /// 
    urlConnection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary); 
    //urlConnection.setRequestProperty("Content-Type", "image/jpeg"); 
    urlConnection.setRequestMethod("POST"); 

    ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
    imageThumbnail.compress(Bitmap.CompressFormat.JPEG, IMAGE_QUALITY, stream); 
    byte[] byteArray = stream.toByteArray(); 

    dos = new DataOutputStream(urlConnection.getOutputStream()); 
    dos.writeBytes(twoHyphens + boundary + crlf); 
    dos.writeBytes("Content-Disposition: form-data; name=\"file\"; filename=\"" + imageFileName + "\"" + crlf); 
    dos.writeBytes("Content-Type: " + mimeType + crlf); 
    dos.writeBytes(crlf); 
    dos.write(byteArray); 
    dos.writeBytes(crlf); 
    dos.writeBytes(twoHyphens + boundary + twoHyphens); 
    dos.flush(); 
    dos.close(); 

    String line = null; 
    InputStreamReader isr = new InputStreamReader(urlConnection.getInputStream()); 
    BufferedReader reader = new BufferedReader(isr); 
    StringBuilder sb = new StringBuilder(); 
    while ((line = reader.readLine()) != null) { 
     sb.append(line).append("\n"); 
    } 
    response = sb.toString(); 

    isr.close(); 
    reader.close(); 

} catch (MalformedURLException e) { 
    e.printStackTrace(); 
    response = "Malformed URL"; 

} catch (IOException e) { 
    e.printStackTrace(); 
    response = "IO Exception"; 
} 

return response; 

У меня есть эти внутри @Override protected String doInBackground(String... params) из AsyncTask<String, Void, String>

Смежные вопросы