2013-03-21 5 views
3

Я разрабатываю небольшое приложение для Android, в котором я хотел загрузить изображение с моего устройства Android на свой сервер. Я использую для этого HttpURLConnection.Загрузка байта массива с httpurlconnection и android

Я делаю это следующим образом:

Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.arrow_down_float); 

ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
bitmap.compress(CompressFormat.JPEG, 100, bos); 

byte[] data = bos.toByteArray(); 

connection = (HttpURLConnection) url.openConnection(); 
connection.setDoOutput(true); 
connection.setRequestProperty("Content-Type", "image/jpeg"); 
connection.setRequestMethod(method.toString()); 

ByteArrayOutputStream bout = new ByteArrayOutputStream(); 
bout.write(data); 
bout.close(); 

Я использую ByteArrayOutputStream, но я не знаю, как передать эти данные с моим HttpURLConnection. Это правильный способ передачи необработанных данных изображения. Я просто хотел отправить массив байтов, содержащий данные изображения. Без преобразования или без многократной отправки. Мой код работает отлично без каких-либо ошибок, но это мой сервер дает мне ответ {"error":"Mimetype not supported: inode\/x-empty"}

Я сделал это с помощью HttpClient setEntity и его работы хорошо с этим. Но я хочу использовать urlconnection.

Я что-то не так? Как это сделать? Спасибо.

+0

Я хотел бы отправить этот массив байтов, поскольку он не преобразовывает его в строку или многопрофильное решение. Как и в httpclient, я сделал это 'client.setEntity (новый ByteArrayEntity (data));' есть ли способ сделать simillar в urlconnection. Нужна помощь. Спасибо. – nilkash

ответ

3
private void doFileUpload(){ 

      HttpURLConnection conn = null; 
      DataOutputStream dos = null; 
      DataInputStream inStream = null; 


      String exsistingFileName = "/sdcard/six.3gp"; 
      // Is this the place are you doing something wrong. 

      String lineEnd = "\r\n"; 
      String twoHyphens = "--"; 
      String boundary = "*****"; 


      int bytesRead, bytesAvailable, bufferSize; 

      byte[] buffer; 

      int maxBufferSize = 1*1024*1024; 

      String urlString = "http://192.168.1.5/upload.php"; 



      try 
      { 


      Log.e("MediaPlayer","Inside second Method"); 

      FileInputStream fileInputStream = new FileInputStream(new File(exsistingFileName)); 



      URL url = new URL(urlString); 

      conn = (HttpURLConnection) url.openConnection(); 

      conn.setDoInput(true); 

      // Allow Outputs 
      conn.setDoOutput(true); 

      // Don't use a cached copy. 
      conn.setUseCaches(false); 

      // Use a post method. 
      conn.setRequestMethod("POST"); 

      conn.setRequestProperty("Connection", "Keep-Alive"); 

      conn.setRequestProperty("Content-Type", "multipart/form-data;boundary="+boundary); 


      dos = new DataOutputStream(conn.getOutputStream()); 

      dos.writeBytes(twoHyphens + boundary + lineEnd); 
      dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\"" + exsistingFileName +"\"" + lineEnd); 
      dos.writeBytes(lineEnd); 

      Log.e("MediaPlayer","Headers are written"); 



      bytesAvailable = fileInputStream.available(); 
      bufferSize = Math.min(bytesAvailable, maxBufferSize); 
      buffer = new byte[bufferSize]; 



      bytesRead = fileInputStream.read(buffer, 0, bufferSize); 

      while (bytesRead > 0) 
      { 
      dos.write(buffer, 0, bufferSize); 
      bytesAvailable = fileInputStream.available(); 
      bufferSize = Math.min(bytesAvailable, maxBufferSize); 
      bytesRead = fileInputStream.read(buffer, 0, bufferSize); 
      } 



      dos.writeBytes(lineEnd); 

      dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); 

      BufferedReader in = new BufferedReader(
          new InputStreamReader(
          conn.getInputStream())); 
       String inputLine; 

       while ((inputLine = in.readLine()) != null) 
        tv.append(inputLine); 




      // close streams 
      Log.e("MediaPlayer","File is written"); 
      fileInputStream.close(); 
      dos.flush(); 
      dos.close(); 


      } 
      catch (MalformedURLException ex) 
      { 
       Log.e("MediaPlayer", "error: " + ex.getMessage(), ex); 
      } 

      catch (IOException ioe) 
      { 
       Log.e("MediaPlayer", "error: " + ioe.getMessage(), ioe); 
      } 


      //------------------ read the SERVER RESPONSE 


      try { 
       inStream = new DataInputStream (conn.getInputStream()); 
       String str; 

       while ((str = inStream.readLine()) != null) 
       { 
        Log.e("MediaPlayer","Server Response"+str); 
       } 
       /*while((str = inStream.readLine()) !=null){ 

       }*/ 
       inStream.close(); 

      } 
      catch (IOException ioex){ 
       Log.e("MediaPlayer", "error: " + ioex.getMessage(), ioex); 
      } 



     } 

Complete Demo

+0

Привет, Нирав спасибо за повтор. На самом деле я не хочу использовать multipart. Я просто хочу отправить массив байтов исходного изображения в тело запроса. Потому что моя сторона сервера не обрабатывает многочастное изображение. Поэтому я просто хотел отправить массив байтов. Помогло ли ваше решение мне это сделать? Нужна помощь. Спасибо. – nilkash

+0

@nirav, этот код работает нормально, но как добавить имя файла также как параметр вместе с файлом изображения? – Sagar

4

Вы должны открыть соединение выходного потока и записать данные в нем. Вы можете попробовать это:

Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.arrow_down_float); 

connection = (HttpURLConnection) url.openConnection(); 
connection.setDoOutput(true); 
connection.setRequestProperty("Content-Type", "image/jpeg"); 
connection.setRequestMethod(method.toString()); 
OutputStream outputStream = connection.getOutputStream(); 

ByteArrayOutputStream bos = new ByteArrayOutputStream(outputStream); 
bitmap.compress(CompressFormat.JPEG, 100, bos); 

bout.close(); 
outputStream.close(); 

С этим утверждением:

bitmap.compress(CompressFormat.JPEG, 100, bos); 

Вы делаете две вещи: сжать битовую карту и отправить приведенные данные (байты, которые строят JPG) для BOS потока, которые отправляют приведенные данные в соединение выходного потока.

Также вы можете записать данные в выходном потоке соединения напрямую, заменив это:

ByteArrayOutputStream bos = new ByteArrayOutputStream(outputStream); 
bitmap.compress(CompressFormat.JPEG, 100, bos); 

с этим:

bitmap.compress(CompressFormat.JPEG, 100, outputStream); 

Я надеюсь, что это поможет вам понять, как работает HttpURLConnection.

Кроме того, вы не должны полностью загружать весь растровый рисунок, чтобы исключить исключения из «вне памяти», например, открывая растровое изображение потоками.

0
HttpParams httpParameters = new BasicHttpParams(); 
       HttpProtocolParams.setContentCharset(httpParameters, HTTP.UTF_8); 
       HttpProtocolParams.setHttpElementCharset(httpParameters, HTTP.UTF_8); 
       HttpClient httpclient = new DefaultHttpClient(httpParameters); 
       HttpPost httppost = new HttpPost(ServerConstants.urll); 
       httppost.setHeader("Content-type","application/octet-stream");//application/octet-stream  

      // the below is the important one, notice no multipart here just the raw image data 
      httppost.setEntity(new ByteArrayEntity(imagebytess));    


      try { 
       HttpResponse res = httpclient.execute(httppost);     

       BufferedReader reader = new BufferedReader(new InputStreamReader(
         res.getEntity().getContent(), "UTF-8")); 
       String sResponse; 
       StringBuilder s = new StringBuilder(); 
       System.out.println("Response: " + res.getStatusLine().getStatusCode()); 
       while ((sResponse = reader.readLine()) != null) { 
        s = s.append(sResponse); 
        System.out.println("Response: " + res.getStatusLine().getStatusCode()); 
       }`enter code here` 
       System.out.println("Response: " + s.toString()); 
      } catch `enter code here`(ClientProtocolException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
Смежные вопросы