Android通过MultipartEntity将图像发送到服务器 – 设置Content-type?

我已经阅读了许多关于从Android应用程序和内容types方面向服务器发送图像的post,它们分为三类:

a)他们根本不设置内容types,可能不知何故他们的代码工作

b)他们正在使用已弃用的方法

c)他们正在使用与我所选的完全不同的方法。

我想将文件发送到服务器并将其存储在一个文件夹中。

我的代码是一个拼凑而成的,在阅读大量文章和文章之后,我设法完成的一项屠杀工作,这里是:

public void uploadImageToServer(String imagePath) throws Exception { try { // set the http handlers httpClient = new DefaultHttpClient(); localContext = new BasicHttpContext(); // why do I need this? postRequest = new HttpPost("http://asd.com/asd.php"); //postRequest.addHeader("Content-type", "image/jpeg"); // - this didnt work // deal with the file ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); bitmap = BitmapFactory.decodeFile(imagePath); bitmap.compress(CompressFormat.JPEG, 75, byteArrayOutputStream); byte[] byteData = byteArrayOutputStream.toByteArray(); //String strData = Base64.encodeToString(data, Base64.DEFAULT); // I have no idea why Im doing this ByteArrayBody byteArrayBody = new ByteArrayBody(byteData, "image"); // second parameter is the name of the image (//TODO HOW DO I MAKE IT USE THE IMAGE FILENAME?) // send the package multipartEntity = MultipartEntityBuilder.create(); multipartEntity.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); multipartEntity.addPart("uploaded_file", byteArrayBody); postRequest.setEntity(multipartEntity.build()); // get the response. we will deal with it in onPostExecute. response = httpClient.execute(postRequest, localContext); bitmap.recycle(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } 

而错误是:

  FATAL EXCEPTION: AsyncTask #1 java.lang.RuntimeException: An error occured while executing doInBackground() android.os.AsyncTask$3.done(AsyncTask.java:200) java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274) java.util.concurrent.FutureTask.setException(FutureTask.java:125) java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308) java.util.concurrent.FutureTask.run(FutureTask.java:138) java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) java.lang.Thread.run(Thread.java:1019) Caused by: java.lang.NoClassDefFoundError: org.apache.http.entity.ContentType org.apache.http.entity.mime.content.ByteArrayBody.<init>(ByteArrayBody.java:67) org.apache.http.entity.mime.content.ByteArrayBody.<init>(ByteArrayBody.java:87) 

Solutions Collecting From Web of "Android通过MultipartEntity将图像发送到服务器 – 设置Content-type?"

如果你正在使用一个库,你需要把它放到/ libs文件夹中。

编辑:

http://hc.apache.org/downloads.cgi下载httpmime,httpcore和httpclient&#x5E93;

使用此代码上传图片文件

 HttpClient client = new DefaultHttpClient(); HttpPost postMethod = new HttpPost("http://localhost/Upload/index.php"); File file = new File(filePath); MultipartEntity entity = new MultipartEntity(); FileBody contentFile = new FileBody(file); entity.addPart("userfile",contentFile); StringBody contentString = new StringBody("This is contentString"); entity.addPart("contentString",contentString); postMethod.setEntity(entity); client.execute(postMethod); 

并在PHP中使用此代码来接收

 $uploads_dir = '/Library/WebServer/Documents/Upload/upload/'.$_FILES['userfile']['name']; if(is_uploaded_file($_FILES['userfile']['tmp_name'])) { echo $_POST["contentString"]."\n"; echo "File path = ".$uploads_dir; move_uploaded_file ($_FILES['userfile'] ['tmp_name'], $uploads_dir); } else { echo "\n Upload Error"; echo "filename '". $_FILES['userfile']['tmp_name'] . "'."; print_r($_FILES); } 

使用此代码: –

 public class HttpMultipartUpload { String lineEnd = "\r\n"; String twoHyphens = "--"; String boundary = "AaB03x87yxdkjnxvi7"; public String upload(URL url, File file, String fileParameterName, HashMap<String, String> parameters) throws IOException { HttpURLConnection conn = null; DataOutputStream dos = null; DataInputStream dis = null; FileInputStream fileInputStream = null; byte[] buffer; int maxBufferSize = 20 * 1024; try { // ------------------ CLIENT REQUEST fileInputStream = new FileInputStream(file); // open a URL connection to the Servlet // Open a HTTP connection to the URL conn = (HttpURLConnection) url.openConnection(); // Allow Inputs 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("Content-Type", "multipart/form-data;boundary=" + boundary); dos = new DataOutputStream(conn.getOutputStream()); dos.writeBytes(twoHyphens + boundary + lineEnd); dos.writeBytes("Content-Disposition: form-data; name=\"" + fileParameterName + "\"; filename=\"" + mFileName + ".jpg" + "\"" + lineEnd); dos.writeBytes("Content-Type:image/jpg" + lineEnd); dos.writeBytes(lineEnd); // create a buffer of maximum size buffer = new byte[Math.min((int) file.length(), maxBufferSize)]; int length; // read file and write it into form... while ((length = fileInputStream.read(buffer)) != -1) { dos.write(buffer, 0, length); } for (String name : parameters.keySet()) { dos.writeBytes(lineEnd); dos.writeBytes(twoHyphens + boundary + lineEnd); dos.writeBytes("Content-Disposition: form-data; name=\"" + name + "\"" + lineEnd); dos.writeBytes(lineEnd); dos.writeBytes(parameters.get(name)); } // send multipart form data necessary after file data... dos.writeBytes(lineEnd); dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); dos.flush(); } finally { if (fileInputStream != null) fileInputStream.close(); if (dos != null) dos.close(); } // ------------------ read the SERVER RESPONSE try { dis = new DataInputStream(conn.getInputStream()); StringBuilder response = new StringBuilder(); String line; while ((line = dis.readLine()) != null) { response.append(line).append('\n'); } System.out.println("Upload file responce:" + response.toString()); return response.toString(); } finally { if (dis != null) dis.close(); } } } 

阅读文件http的来源。 检查此解决scheme:

  1. 调用新的MultipartEntity:

    MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE,null,Charset.forName(“UTF-8”));

  2. 添加请求标题

    heads.put(“Content-Type”,“image / png; charset = utf-8”);