2013-11-07 5 views
2

В моем приложении мне нужно отправить изображение и примечание (текст 180) символов на сервер.Необходимо отправить изображение и текст на сервер

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

Какой будет подход?

В настоящее время отправляю изображение, используя нить.

// open a URL connection to the Servlet 
       FileInputStream fileInputStream = new FileInputStream(
         sourceFile); 
       URL url = new URL(
         "http://xxx.com/image.php"); 

       // Open a HTTP connection to the URL 
       conn = (HttpURLConnection) url.openConnection(); 
       conn.setDoInput(true); // Allow Inputs 
       conn.setDoOutput(true); // Allow Outputs 
       conn.setUseCaches(false); // Don't use a Cached Copy 
       conn.setRequestMethod("POST"); 
       conn.setRequestProperty("Connection", "Keep-Alive"); 
       conn.setRequestProperty("ENCTYPE", "multipart/form-data"); 
       conn.setRequestProperty("Content-Type", 
         "multipart/form-data;boundary=" + boundary); 
       conn.setRequestProperty("uploaded_file", fileName); 
       // conn.setRequestProperty("id", imei); 

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

       dos.writeBytes(twoHyphens + boundary + lineEnd); 
       dos.writeBytes("Content-Disposition: form-data; name=uploaded_file; filename=" 
         + fileName + imei + lineEnd); 


       dos.writeBytes(lineEnd); 

       // create a buffer of maximum size 
       bytesAvailable = fileInputStream.available(); 

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

       // read file and write it into form... 
       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); 

       } 

       // send multipart form data necesssary after file data... 
       dos.writeBytes(lineEnd); 
       dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); 

       // Responses from the server (code and message) 
       serverResponseCode = conn.getResponseCode(); 
       String serverResponseMessage = conn.getResponseMessage(); 

       Log.i("uploadFile", "HTTP Response is : " 
         + serverResponseMessage + ": " + serverResponseCode); 

       if (serverResponseCode == 200) { 

        runOnUiThread(new Runnable() { 
         public void run() { 

          Toast.makeText(getBaseContext(), 
            "File Upload Complete.", Toast.LENGTH_SHORT) 
            .show(); 
          File delfile = new File(currentfile); 
          //delfile.delete(); 
         } 
        }); 
       } 

       // close the streams // 
       fileInputStream.close(); 
       dos.flush(); 
       dos.close(); 

      } catch (MalformedURLException ex) { 

       // dialog.dismiss(); 
       ex.printStackTrace(); 

       runOnUiThread(new Runnable() { 
        public void run() { 
         // messageText.setText("MalformedURLException Exception : check script url."); 
         Toast.makeText(getBaseContext(), 
           "MalformedURLException", Toast.LENGTH_SHORT) 
           .show(); 
        } 
       }); 

       Log.e("Upload file to server", "error: " + ex.getMessage(), ex); 
      } catch (Exception e) { 

       // dialog.dismiss(); 
       e.printStackTrace(); 

       runOnUiThread(new Runnable() { 
        public void run() { 
         // messageText.setText("Got Exception : see logcat "); 
         Toast.makeText(getBaseContext(), 
           "upload failed Please, try after some time ", 
           Toast.LENGTH_SHORT).show(); 
        } 
       }); 
       Log.e("Upload file to server Exception", 
         "Exception : " + e.getMessage(), e); 
      } 
      // dialog.dismiss(); 
      return serverResponseCode; 

     } // End else block 

Для отправки текста я использую простой метод почтового сообщения.

Мне нужно это для моего приложения, где мы собираемся сделать снимок и набрать что-то в окне edittext и отправить.

+0

вы должны использовать HTTPClient с HttpPost и MultipartEntity для передачи данных MIME типа вместе с текстом. –

+0

Я использую httpclient, httpcore, mime4j, apachehttpclient jar-файлы, но все еще получаю ошибку для многочастного объекта –

ответ

5

Прежде всего, вам нужно это jar-файл org.apache.httpcomponents.httpclient_4.2.1 и импортировать его на путь сборки.

Вы можете сделать это таким образом. Рассмотрим следующую

import org.apache.http.NameValuePair; 
import org.apache.http.message.BasicNameValuePair; 
import org.json.JSONException; 
import org.json.JSONObject; 

И заявление:

private List<NameValuePair> nameValuePairs; 

private HttpURLConnection connection = null; 
private DataOutputStream outputStream = null; 
private String lineEnd = "\r\n"; 
private String twoHyphens = "--"; 
private String boundary = "*****"; 
int bytesRead, bytesAvailable, bufferSize; 
byte[] buffer; 
int maxBufferSize = 1 * 1024 * 1024; 

И исходный код выглядит следующим образом:

try { 

      FileInputStream fileInputStream = new FileInputStream(StickerToSend); 
      URL url = new URL("Your URL"); 
      connection = (HttpURLConnection) 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); 

      outputStream = new DataOutputStream(connection.getOutputStream()); 

      // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
        // Here you can add parameters as follows : 

      outputStream.writeBytes(twoHyphens + boundary + lineEnd); 

        // The keyword "type" is the key value and 

      outputStream 
        .writeBytes("Content-Disposition: form-data; name=\"type\"" 
          + lineEnd); 
      outputStream.writeBytes(lineEnd); 

        // You can assign values as like follows : 

      outputStream.writeBytes("Your value"); 
      outputStream.writeBytes(lineEnd); 
      outputStream.writeBytes(twoHyphens + boundary + lineEnd); 

      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

      outputStream.writeBytes(twoHyphens + boundary + lineEnd); 
      outputStream 
        .writeBytes("Content-Disposition: form-data; name=\"sticker\";filename=\"" 
          + StickerToSend + "\"" + lineEnd); 
      outputStream.writeBytes(lineEnd); 

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

      // Read file 
      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); 

      // int serverResponseCode = connection.getResponseCode(); 
      String serverResponseMessage = connection.getResponseMessage(); 

      Log.d("The server response message ", " Server Response" 
        + serverResponseMessage); 

      fileInputStream.close(); 
      outputStream.flush(); 
      // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
      InputStream is = connection.getInputStream(); 
      // retrieve the response from server 
      int ch; 
      StringBuffer b = new StringBuffer(); 
      while ((ch = is.read()) != -1) { 
       b.append((char) ch); 
      } 
      String result = b.toString(); 
      Log.i("Response", result); 

      JSONObject jsonobject; 
      try { 
       jsonobject = new JSONObject(result); 
       boolean isPosted = jsonobject.getJSONObject("response") 
         .getString("httpCode").equals("200") ? true : false; 

       if (isPosted) 
        mHandler.sendEmptyMessage(POST_SUCCESS); 
       else 
        mHandler.sendEmptyMessage(POST_FAILURE); 
      } catch (JSONException e) { 
       Log.d("the xceptions ", 
         "Xcep in posting status messages are : " 
           + e.getMessage()); 
      } 
      outputStream.close(); 

     } catch (Exception e) { 
      Log.d("Xceptions", 
        "Xceptions are upload video file " + e.getMessage()); 
     } 

Этот фрагмент кода действительно работает очень хорошо. Я также проверил это. Пожалуйста, не стесняйтесь, если возникнут какие-либо проблемы.

+0

У вас есть текст отправки кода? –

+1

Вот он: 'outputStream.writeBytes (« Content-Disposition: form-data; name = \ »ваше имя параметра \" "+ lineEnd); outputStream.writeBytes (lineEnd); outputStream.writeBytes («Ваше значение»); ' –

+1

Большое спасибо :) –

0

Вы можете использовать base64 encoder для кодирования изображения в строку (Base 64 encode and decode example code) и сделать веб-службу для отправки на сервер. Таким образом, в этом веб-сервисе вы можете добавить несколько входов

0

Попробуйте это может, поможет вам

public void WSCall(final String filePath, final String textTosend) { 

     try { 

      DefaultHttpClient httpclient = new DefaultHttpClient(); 
      HttpPost httppost = new HttpPost("http://xxx.com/image.php"); 
      StringBody data = new StringBody(textTosend, Charset.forName(HTTP.UTF_8)); 
      MultiPartEntity entity = new MultiPartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); 
      entity.addPart("uploaded_file", new FileBody(new File(filePath), "image/png")); 
      entity.addPart("text", data); 
      httppost.setEntity(entity); 
      HttpResponse WSresponse = httpclient.execute(httppost); 
     } catch (Throwable e) { 

     } 

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