将图片发送到Web服务器

我必须构建一个应该将图片从手机发送到Web服务器的应用程序。 不幸的是,我真的不知道该怎么做。 有人可以帮帮我吗?

使用Web服务来完成此任务。

要在Android中使用Web服务,请访问此链接。

  1. 用于从Android设备调用Web服务的kSoap2库。
  2. 在android中调用简单的Web服务。
  3. 通过HttpClient调用Web服务和上传文件
  4. 使用KSOAP返回对象数组的Web服务 – 适用于复杂对象。
  5. 从Android访问JAX-WS Web服务
  6. 操作方法:Android作为RESTful客户端

这是我用来使用原始套接字将图像上传到远程服务器的代码。 通过httpclient的原始套接字的优点是您可以显示上传进度条。

免责声明:此代码的大部分主要来自stackoverflow。

/** * Asynchronous task to upload file to server */ class UploadImageTask extends AsyncTask { /** Upload file to this url */ private static final String UPLOAD_URL = "http://thibault-laptop:8080/report"; /** Send the file with this form name */ private static final String FIELD_FILE = "file"; private static final String FIELD_LATITUDE = "latitude"; private static final String FIELD_LONGITUDE = "longitude"; /** * Prepare activity before upload */ @Override protected void onPreExecute() { super.onPreExecute(); setProgressBarIndeterminateVisibility(true); mConfirm.setEnabled(false); mCancel.setEnabled(false); showDialog(UPLOAD_PROGRESS_DIALOG); } /** * Clean app state after upload is completed */ @Override protected void onPostExecute(Boolean result) { super.onPostExecute(result); setProgressBarIndeterminateVisibility(false); mConfirm.setEnabled(true); mDialog.dismiss(); if (result) { showDialog(UPLOAD_SUCCESS_DIALOG); } else { showDialog(UPLOAD_ERROR_DIALOG); } } @Override protected Boolean doInBackground(File... image) { return doFileUpload(image[0], UPLOAD_URL); } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); if (values[0] == 0) { mDialog.setTitle(getString(R.string.progress_dialog_title_uploading)); } mDialog.setProgress(values[0]); } /** * Upload given file to given url, using raw socket * @see http://stackoverflow.com/questions/4966910/androidhow-to-upload-mp3-file-to-http-server * * @param file The file to upload * @param uploadUrl The uri the file is to be uploaded * * @return boolean true is the upload succeeded */ private boolean doFileUpload(File file, String uploadUrl) { HttpURLConnection conn = null; DataOutputStream dos = null; String lineEnd = "\r\n"; String twoHyphens = "--"; String boundary = "*****"; String separator = twoHyphens + boundary + lineEnd; int bytesRead, bytesAvailable, bufferSize; byte[] buffer; int maxBufferSize = 1 * 1024 * 1024; int sentBytes = 0; long fileSize = file.length(); // The definitive url is of the kind: // http://host/report/latitude,longitude uploadUrl += "/" + mLocation.getLatitude() + "," + mLocation.getLongitude(); // Send request try { // Configure connection URL url = new URL(uploadUrl); conn = (HttpURLConnection) url.openConnection(); conn.setDoInput(true); conn.setDoOutput(true); conn.setUseCaches(false); conn.setRequestMethod("PUT"); conn.setRequestProperty("Connection", "Keep-Alive"); conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary); publishProgress(0); dos = new DataOutputStream(conn.getOutputStream()); // Send location params writeFormField(dos, separator, FIELD_LATITUDE, "" + mLocation.getLatitude()); writeFormField(dos, separator, FIELD_LONGITUDE, "" + mLocation.getLongitude()); // Send multipart headers dos.writeBytes(twoHyphens + boundary + lineEnd); dos.writeBytes("Content-Disposition: form-data; name=\"" + FIELD_FILE + "\";filename=\"" + file.getName() + "\"" + lineEnd); dos.writeBytes(lineEnd); // Read file and create buffer FileInputStream fileInputStream = new FileInputStream(file); bytesAvailable = fileInputStream.available(); bufferSize = Math.min(bytesAvailable, maxBufferSize); buffer = new byte[bufferSize]; // Send file data bytesRead = fileInputStream.read(buffer, 0, bufferSize); while (bytesRead > 0) { // Write buffer to socket dos.write(buffer, 0, bufferSize); // Update progress dialog sentBytes += bufferSize; publishProgress((int)(sentBytes * 100 / fileSize)); 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); dos.flush(); dos.close(); fileInputStream.close(); } catch (IOException ioe) { Log.e(TAG, "Cannot upload file: " + ioe.getMessage(), ioe); return false; } // Read response try { int responseCode = conn.getResponseCode(); return responseCode == 200; } catch (IOException ioex) { Log.e(TAG, "Upload file failed: " + ioex.getMessage(), ioex); return false; } catch (Exception e) { Log.e(TAG, "Upload file failed: " + e.getMessage(), e); return false; } } private void writeFormField(DataOutputStream dos, String separator, String fieldName, String fieldValue) throws IOException { dos.writeBytes(separator); dos.writeBytes("Content-Disposition: form-data; name=\"" + fieldName + "\"\r\n"); dos.writeBytes("\r\n"); dos.writeBytes(fieldValue); dos.writeBytes("\r\n"); } } 

要开始上载,请使用以下命令:

 new UploadImageTask().execute(new File(imagePath)); 

我在Android中使用了Rest webservice和DefaultHttpClient类。 要创建示例REST Web服务并在Apache Tomcat中部署,请按照Vogella教程进行操作

要使rest服务接受图像,服务器端需要多部分内容types

 @POST @Consumes(MediaType.MULTIPART_FORM_DATA) @Produces("application/json") public String uploadFile(@FormDataParam("image") InputStream uploadedInputStream, @FormDataParam("image") FormDataContentDisposition fileDetail) { String uploadedFileLocation = "e://game/" + fileDetail.getFileName(); boolean response=false; // save it try{ OutputStream out = null; int read = 0; byte[] bytes = new byte[1024]; out = new FileOutputStream(new File(uploadedFileLocation)); while ((read = uploadedInputStream.read(bytes)) != -1) { out.write(bytes, 0, read); } out.flush(); out.close(); return response=true; }catch(IOException e){ e.printStackTrace(); } return response; } 

在android端发送图像(我在AsyncTask的doInBackground中做了)

  HttpClient httpClient = new DefaultHttpClient(); HttpPost postRequest = new HttpPost("http://"+ip+":8080/MiniJarvisFaceServer/image"); MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); reqEntity.addPart("image", new FileBody(file)); postRequest.setEntity(reqEntity); ResponseHandler handler = new BasicResponseHandler(); String response = httpClient.execute(postRequest,handler); Log.d("Response", response); httpClient.getConnectionManager().shutdown(); 

要执行HTTP请求,您可以使用DefaultHttpClient类和HttpPost类

 HttpClient client = new DefaultHttpClient(); HttpPost post = new HttpPost("http://your.site/your/service"); // set some headers if needed post.addHeader(....); // and an eclosed entity to send post.setEntity(....); // send a request and get response (if needed) InputStream responseStream = client.execute(post)..getEntity().getContent(); 

将实体添加到请求的方法取决于远程服务的工作方式。

请遵循本指南。 它在服务器端使用PHP。 我使用Android Studio和httpmime.4.3.6并且像魅力一样工作http://www.androidhive.info/2014/12/android-uploading-camera-image-video-to-server-with-progress-bar/

它还支持video,它显示了如何响应服务器的一些结果。 唯一棘手的一点是确保你使用HttClient for Android和正确版本的HttpMime。 现在HttpMime 4.4.x无法运行,浪费了我一周的时间。 使用4.3.6