В моем приложении мне нужно отправить изображение и примечание (текст из 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
Для отправки текста я использую простой метод http post.
Мне нужно это для моего приложения, где мы собираемся сделать снимок и набрать что-то в окне edittext и отправить.
Прежде всего, вам понадобится файл org.apache.httpcomponents.httpclient_4.2.1 jar и импортируйте его в свой путь сборки.
Вы можете сделать это таким образом. рассмотрим следующее
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()); }
Этот код действительно работает очень хорошо. Я также проверил это. Пожалуйста, не стесняйтесь, если возникнут какие-либо проблемы.
Вы можете использовать base64 encoder для кодирования изображения в строку ( код кода кодирования и декодирования Base 64 ) и сделать веб-службу для отправки этого сервера. Таким образом, в этом веб-сервисе вы можете добавить несколько входов
Попробуйте это может помочь вам
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) { } }