从Android到Webserver(localhost)发送图像/文本文件

我是Android编程的新手,我的任务是将图像和文本数据发送到Web服务器(localhost),我已经尝试了很多代码来完成这项工作。

他们都不会工作。 每当我尝试执行代码时,我的应用程序就崩溃了,所以我决定调试代码,看看问题是什么。 然后我发现了

每当找到MultipartEntity时 ,代码就会崩溃..我真的不知道为什么……

守则是这样的

Log.v(TAG, "(1)"); HttpClient httpClient; HttpPost postRequest; Log.v(TAG, "(2)" + picturePath); MultipartEntity reqEntity; ResponseHandler responseHandler; Log.v(TAG, "(3)"); File file; FileBody fileBody; Log.v(TAG, "(4)"); httpClient = new DefaultHttpClient(); postRequest = new HttpPost("http://192.168.5.132/mysite/test.php"); responseHandler = new BasicResponseHandler(); Log.v(TAG, "(5)"); // Indicate that this information comes in parts (text and file) reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); Log.v(TAG, "(6)"); file = new File(picturePath); fileBody = new FileBody(file, "images/jpeg"); reqEntity.addPart("fileupload", fileBody); Log.v(TAG, "(7)"); try { reqEntity.addPart("username", new StringBody("un")); reqEntity.addPart("password", new StringBody("pw")); postRequest.setEntity(reqEntity); httpClient.execute(postRequest, responseHandler); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } 

我已经在代码中包含了Logs,以查看代码在执行期间停止的位置。 这是log cat输出!

 08-27 12:22:47.153: V/(10358): (1) 08-27 12:22:47.153: V/(10358): (2)/storage/sdcard0/Pictures/boarding_pass.bmp 08-27 12:22:47.153: V/(10358): (3) 08-27 12:22:47.153: V/(10358): (4) 08-27 12:22:47.153: V/(10358): (5) 08-27 12:22:47.153: D/AndroidRuntime(10358): Shutting down VM 08-27 12:22:47.153: W/dalvikvm(10358): threadid=1: thread exiting with uncaught exception (group=0x417da2a0) 08-27 12:22:47.163: E/AndroidRuntime(10358): FATAL EXCEPTION: main 08-27 12:22:47.163: E/AndroidRuntime(10358): java.lang.IllegalStateException: Could not execute method of the activity 08-27 12:22:47.163: E/AndroidRuntime(10358): at android.view.View$1.onClick(View.java:3614) 08-27 12:22:47.163: E/AndroidRuntime(10358): at android.view.View.performClick(View.java:4107) 08-27 12:22:47.163: E/AndroidRuntime(10358): at android.view.View$PerformClick.run(View.java:17056) 08-27 12:22:47.163: E/AndroidRuntime(10358): at android.os.Handler.handleCallback(Handler.java:615) 08-27 12:22:47.163: E/AndroidRuntime(10358): at android.os.Handler.dispatchMessage(Handler.java:92) 08-27 12:22:47.163: E/AndroidRuntime(10358): at android.os.Looper.loop(Looper.java:137) 08-27 12:22:47.163: E/AndroidRuntime(10358): at android.app.ActivityThread.main(ActivityThread.java:4830) 08-27 12:22:47.163: E/AndroidRuntime(10358): at java.lang.reflect.Method.invokeNative(Native Method) 08-27 12:22:47.163: E/AndroidRuntime(10358): at java.lang.reflect.Method.invoke(Method.java:511) 08-27 12:22:47.163: E/AndroidRuntime(10358): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 08-27 12:22:47.163: E/AndroidRuntime(10358): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556) 08-27 12:22:47.163: E/AndroidRuntime(10358): at dalvik.system.NativeStart.main(Native Method) 08-27 12:22:47.163: E/AndroidRuntime(10358): Caused by: java.lang.reflect.InvocationTargetException 08-27 12:22:47.163: E/AndroidRuntime(10358): at java.lang.reflect.Method.invokeNative(Native Method) ...... 

真的需要你的帮助..非常感谢你..

试试这个代码100%工作。 通过多部分数据传递完成图像上传

       

Android代码

 import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import android.app.Activity; import android.app.ProgressDialog; import android.content.Intent; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity implements OnClickListener{ private TextView messageText; private Button uploadButton, btnselectpic; private ImageView imageview; private int serverResponseCode = 0; private ProgressDialog dialog = null; private String upLoadServerUri = null; private String imagepath=null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); uploadButton = (Button)findViewById(R.id.uploadButton); messageText = (TextView)findViewById(R.id.messageText); btnselectpic = (Button)findViewById(R.id.button_selectpic); imageview = (ImageView)findViewById(R.id.imageView_pic); btnselectpic.setOnClickListener(this); uploadButton.setOnClickListener(this); upLoadServerUri = "http://192.168.2.4/fileupload/upljson.php"; } @Override public void onClick(View arg0) { if(arg0==btnselectpic) { Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(intent, "Complete action using"), 1); } else if (arg0==uploadButton) { dialog = ProgressDialog.show(MainActivity.this, "", "Uploading file...", true); messageText.setText("uploading started....."); new Thread(new Runnable() { public void run() { uploadFile(imagepath); } }).start(); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == 1 && resultCode == RESULT_OK) { //Bitmap photo = (Bitmap) data.getData().getPath(); Uri selectedImageUri = data.getData(); imagepath = getPath(selectedImageUri); Bitmap bitmap=BitmapFactory.decodeFile(imagepath); imageview.setImageBitmap(bitmap); messageText.setText("Uploading file path:" +imagepath); } } public String getPath(Uri uri) { String[] projection = { MediaStore.Images.Media.DATA }; Cursor cursor = managedQuery(uri, projection, null, null, null); int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); return cursor.getString(column_index); } public int uploadFile(String sourceFileUri) { String fileName = sourceFileUri; HttpURLConnection conn = null; DataOutputStream dos = null; String lineEnd = "\r\n"; String twoHyphens = "--"; String boundary = "*****"; int bytesRead, bytesAvailable, bufferSize; byte[] buffer; int maxBufferSize = 1 * 1024 * 1024; File sourceFile = new File(sourceFileUri); if (!sourceFile.isFile()) { dialog.dismiss(); Log.e("uploadFile", "Source File not exist :"+imagepath); runOnUiThread(new Runnable() { public void run() { messageText.setText("Source File not exist :"+ imagepath); } }); return 0; } else { try { // open a URL connection to the Servlet FileInputStream fileInputStream = new FileInputStream(sourceFile); URL url = new URL(upLoadServerUri); // 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("file", fileName); dos = new DataOutputStream(conn.getOutputStream()); dos.writeBytes(twoHyphens + boundary + lineEnd); dos.writeBytes("Content-Disposition: form-data; name=\"file\";filename=\"" + fileName + "\"" + 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() { String msg = "File Upload Completed.\n\n See uploaded file here : \n\n" +" C:/xamp/wamp/fileupload/uploads"; messageText.setText(msg); Toast.makeText(MainActivity.this, "File Upload Complete.", Toast.LENGTH_SHORT).show(); } }); } //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(MainActivity.this, "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(MainActivity.this, "Got Exception : see logcat ", Toast.LENGTH_SHORT).show(); } }); Log.e("Upload file to server Exception", "Exception : " + e.getMessage(), e); } dialog.dismiss(); return serverResponseCode; } // End else block } } 

php服务器代码

  

以上代码100%正常工作。 如果你想要多部分实体传递,在你的程序必要的地方尝试这个代码,并在你的php服务器上添加$ _post方法,例如($ name = $ _ POST [‘username’];)

 entity.addPart("user_id", new StringBody(user_id)); Log.d("userid",user_id); entity.addPart("username", new StringBody(username)); entity.addPart("password", new StringBody(password)); entity.addPart("filetype",new StringBody("jpeg")); // entity.addPart("photo", new // StringBody("/storage/sdcard0/Download/1.jpg")); httpPost.setEntity(entity); Log.d("URL Request: ", url.toString()); HttpResponse httpResponse = httpClient.execute(httpPost); int code = httpResponse.getStatusLine().getStatusCode(); 

将所需的值传递给此函数并在php上添加$ _post [“username”],$ _ post [“password”]

 public JSONObject getJSONFromUrl(String url, String username, String password, String photo_path) { InputStream is = null; JSONObject jObj = null; static String jsonResp = ""; String CONTENT_TYPE_JSON = "application/json"; static String json = ""; Context context; try { File file = null; HttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(url); MultipartEntity entity = new MultipartEntity( HttpMultipartMode.BROWSER_COMPATIBLE); if(photo_path != null) file = new File(photo_path); //temp end entity.addPart("username", new StringBody(username)); entity.addPart("password", new StringBody(password)); entity.addPart("file", new FileBody(file)); entity.addPart("filetype",new StringBody("jpeg")); // entity.addPart("photo", new // StringBody("/storage/sdcard0/Download/1.jpg")); httpPost.setEntity(entity); Log.d("URL Request: ", url.toString()); HttpResponse httpResponse = httpClient.execute(httpPost); int code = httpResponse.getStatusLine().getStatusCode(); if (code != 200) { Log.d("HTTP response code is:", Integer.toString(code)); return null; } else { HttpEntity httpEntity = httpResponse.getEntity(); is = httpEntity.getContent(); } } catch (ConnectTimeoutException e) { // TODO: handle exception Log.e("Timeout Exception", e.toString()); return null; } catch (SocketTimeoutException e) { // TODO: handle exception Log.e("Socket Time out", e.toString()); return null; } catch (UnsupportedEncodingException e) { e.printStackTrace(); return null; } catch (ClientProtocolException e) { e.printStackTrace(); return null; } catch (IOException e) { e.printStackTrace(); return null; } try { BufferedReader reader = new BufferedReader(new InputStreamReader( is, "iso-8859-1"), 8); StringBuilder sb = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } is.close(); jsonResp = sb.toString(); Log.d("Content: ", sb.toString()); } catch (Exception e) { Log.e("Buffer Error", "Error converting Response " + e.toString()); return null; } // try parse the string to a JSON object try { jObj = new JSONObject(jsonResp); } catch (JSONException e) { Log.e("JSON Parser", "Error parsing data " + e.toString()); } // return JSON Object return jObj; } 

试试这个,它可以帮助你和is.it完成使用AsyncHttpClient库,获取jar文件并将其附加到您的项目中然后使用以下代码上传任何文件 –

 RequestParams params=new RequestParams(); String file = getImagePath().toString();//get path of file you want to upload File myfile_one=new File(file); try { params.put("image1", myfile_one);//image 1 is the key(it uses key-value pair) } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } AsyncHttpClient client=new AsyncHttpClient(); client.post(Constant.url_two, params,new AsyncHttpResponseHandler(){ //here implement the methods of library and write rest of your code } 

你可以在这个链接中找到连接服务器的其他方法。试试吧,它非常简单

设备/仿真器本身是一个拥有自己的localhost循环的机器。

如您所知,当您使用模拟器时,localhost(127.0.0.1)指的是设备自己的环回服务,而不是您所期望的机器上的服务。

因此,每当您给locahost / 127.0.0.x这意味着它试图在您的设备环境中搜索您的服务时,它就会失败。 因为您的Web服务项目在设备/模拟器循环中不可用。

因此可以使用10.0.2.2访问您的实际机器,它是一个设置为帮助开发的别名。

网络地址空间看看这个。 http://developer.android.com/tools/devices/emulator.html#networkaddresses

您可以使用volley将文件从android上传到服务器。

点击这里

Android Volley文件上传