android 上传文件到服务器
1、编写layout.xml
<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:layout_marginRight="10dip" android:orientation="vertical"> <Button android:id="@+id/upload_btn" android:layout_width="match_parent" android:layout_height="24dip" android:textSize="13sp" android:textColor="#ffffff" android:gravity="center" android:background="@drawable/btn_bg_ora" android:text="上传图片" /> <ImageView android:id="@+id/img_view" android:layout_width="match_parent" android:layout_height="100dp"/> </LinearLayout>
生成效果图如下
2、编写提交图片到服务器 HttpUtils.java
1 public class HttpUtils { 2 /**** 作为标记 ****/ 3 private static final String TAG = "HttpUtils处理类"; 4 5 /** 用户识别 ****/ 6 public static final String User_Agent = ""; 7 public static final String BASE_URL = "http://192.169.1.189:8080/"; 8 9 10 private static final int TIME_OUT = 10 * 10000; // 超时时间 11 private static final String CHARSET = "utf-8"; // 设置编码 12 /** 13 * 上传文件到服务器 14 * @param file 需要上传的文件 15 * @param RequestURL 请求的rul 16 * @return 返回响应的内容 17 */ 18 public static String uploadFile(File file, String RequestURL) { 19 int res=0; 20 String result = null; 21 String BOUNDARY = UUID.randomUUID().toString(); // 边界标识 随机生成 22 String PREFIX = "--", LINE_END = "\r\n"; 23 String CONTENT_TYPE = "multipart/form-data"; // 内容类型 24 25 try { 26 URL url = new URL(RequestURL); 27 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 28 conn.setReadTimeout(TIME_OUT); 29 conn.setConnectTimeout(TIME_OUT); 30 conn.setDoInput(true); // 允许输入流 31 conn.setDoOutput(true); // 允许输出流 32 conn.setUseCaches(false); // 不允许使用缓存 33 conn.setRequestMethod("POST"); // 请求方式 34 conn.setRequestProperty("Charset", CHARSET); // 设置编码 35 conn.setRequestProperty("connection", "keep-alive"); 36 conn.setRequestProperty("Content-Type", CONTENT_TYPE + ";boundary="+ BOUNDARY); 37 38 if (file != null) { 39 /** 40 * 当文件不为空时执行上传 41 */ 42 conn.connect(); 43 DataOutputStream dos = new DataOutputStream(conn.getOutputStream()); 44 StringBuffer sb = new StringBuffer(); 45 sb.append(PREFIX); 46 sb.append(BOUNDARY); 47 sb.append(LINE_END); 48 /** 49 * 这里重点注意: name里面的值为服务器端需要key 只有这个key 才可以得到对应的文件 50 * filename是文件的名字,包含后缀名 51 */ 52 53 sb.append("Content-Disposition: form-data; name=\"image\"; filename=\"" + file.getName() + "\"" + LINE_END); 54 sb.append("Content-Type: application/octet-stream; charset=" + CHARSET + LINE_END); 55 sb.append(LINE_END); 56 dos.write(sb.toString().getBytes()); 57 InputStream is = new FileInputStream(file); 58 byte[] bytes = new byte[8*1024]; 59 int len = 0; 60 while ((len = is.read(bytes)) != -1) { 61 dos.write(bytes, 0, len); 62 } 63 is.close(); 64 dos.write(LINE_END.getBytes()); 65 byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINE_END).getBytes(); 66 dos.write(end_data); 67 dos.flush(); 68 /** 69 * 获取响应码 200=成功 当响应成功,获取响应的流 70 */ 71 res = conn.getResponseCode(); 72 Log.e(TAG, "response code:" + res); 73 if (res == 200) { 74 Log.e(TAG, "request success"); 75 InputStream input = conn.getInputStream(); 76 StringBuffer sb1 = new StringBuffer(); 77 int ss; 78 while ((ss = input.read()) != -1) { 79 sb1.append((char) ss); 80 } 81 result = sb1.toString(); 82 Log.e(TAG, "result : " + result); 83 return result; 84 } else { 85 Log.e(TAG, "request error"); 86 } 87 88 } 89 } catch (MalformedURLException e) { 90 e.printStackTrace(); 91 } catch (IOException e) { 92 e.printStackTrace(); 93 } 94 return null; 95 } 96 }
3、编写activity.java
1 public class UploadActivity extends BaseActivity implements OnItemSelectedListener,OnClickListener{ 2 3 private Button upload_btn; 4 5 private ImageView img_view; 6 private String imgv_path = ""; 7 private final String IMAGE_TYPE = "image/*"; 8 private final int IMAGE_CODE = 0; 9 10 private Handler handler = new Handler(); 11 12 @Override 13 protected void onCreate(Bundle savedInstanceState) { 14 super.onCreate(savedInstanceState); 15 requestWindowFeature(Window.FEATURE_NO_TITLE); 16 setContentView(R.layout.uploadImage); 17 18 img_view = (ImageView) findViewById(R.id.img_view); 19 upload_btn = (Button) findViewById(R.id.upload_btn); 20 upload_btn.setOnClickListener(this); 21 22 } 23 24 @Override 25 public void onClick(View v) { 26 switch (v.getId()) { 27 case R.id.upload_btn: 28 selectImage(); 29 break; 30 default: 31 break; 32 } 33 } 34 35 @Override 36 protected void onDestroy(){ 37 super.onDestroy(); 38 } 39 40 /** 41 * 选择上传图片 42 * @param 43 */ 44 private void selectImage() { 45 Intent getAlbum = new Intent(Intent.ACTION_PICK); 46 getAlbum.setType(IMAGE_TYPE); 47 startActivityForResult(getAlbum, IMAGE_CODE); 48 } 49 50 @Override 51 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 52 if (requestCode == IMAGE_CODE) { 53 // 从相册返回的数据 54 if (data != null) { 55 // 得到图片的全路径 56 Uri uri = data.getData(); 57 if (data != null) { 58 try { 59 // imgv_busicard.setImageBitmap(MediaStore.Images.Media.getBitmap(getContentResolver(), uri)); 60 String[] proj = { MediaStore.Images.Media.DATA }; 61 62 Cursor cursor = getContentResolver().query(uri, proj, null, null, null); 63 if (cursor.moveToFirst()) { 64 int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 65 String path = cursor.getString(column_index); 66 uploadImage(path,MediaStore.Images.Media.getBitmap(getContentResolver(), uri)); 67 } 68 cursor.close(); 69 } catch (Exception e) { 70 // TODO Auto-generated catch block 71 e.printStackTrace(); 72 } 73 74 } 75 } 76 } 77 } 78 79 /** 80 * 上传图片到服务器 81 * @param requestCode 82 * @param path 83 */ 84 85 private void uploadImage(final String path,final Bitmap bmp) { 86 final String url = HttpUtils.BASE_URL + "/uploadImage"; 87 final File file = new File(path); 88 int fileLen = 0; 89 try { 90 FileInputStream fis = new FileInputStream(file); 91 fileLen = fis.available(); 92 }catch (IOException e) { 93 e.printStackTrace(); 94 } 95 if (fileLen > 2 * 1024 * 1024) { 96 DialogUtil.showDialog(UploadActivity.this, R.string.upload_oversize, false); 97 } else { 98 final String[] resultArr = {"",""}; 99 final Runnable runnableUI = new Runnable() { 100 @Override 101 public void run() { 102 if (Integer.valueOf(resultMsg) == 0) { 103 img_view.setImageBitmap(bmp); 104 imgv_path = "/upload/" + resultArr[0]; 105 } else { 106 DialogUtil.showDialog(UploadActivity.this, resultArr[1], false); 107 } 108 } 109 }; 110 new Thread() { 111 @Override 112 public void run() { 113 114 String result = HttpUtils.uploadFile(file, url); 115 116 try { 117 JSONObject json = new JSONObject(result); 118 resultMsg = json.get("error").toString(); 119 resultArr[0] = json.get("src").toString(); 120 resultArr[1] = json.get("message").toString(); 121 handler.post(runnableUI); 122 } catch (JSONException e) { 123 e.printStackTrace(); 124 } 125 } 126 }.start(); 127 } 128 129 } 130 131 }
4、服务器端接收客户端发来请求,本文采用jfinal框架,action如下
1 public void uploadImage() { 2 JSONObject json = new JSONObject(); 3 try { 4 String path_date = CommonUtils.getCurrentTime(); 5 UploadFile uploadFile = getFile("image", "/" + path_date, 2 * 1024 * 1024, "utf-8"); // 最大上传20M的图片 6 String fileName = uploadFile.getFileName();//getPara("filename"); 7 System.out.println(fileName); 8 //fileName = fileName.substring(fileName.lastIndexOf("\\") + 1); // 去掉路径 9 File filePath = new File(PathKit.getWebRootPath() + "/temp/" + path_date); 10 File source = new File(filePath + "/" + fileName); // 获取临时文件对象 11 json.put("message", source.getAbsolutePath() + source.getName()); 12 String extension = fileName.substring(fileName.lastIndexOf(".")); 13 String savePath = PropKit.get("upload_path"); 14 15 extension = extension.toLowerCase(); 16 if (".png".equals(extension) || ".jpg".equals(extension) || ".gif".equals(extension) 17 || ".jpeg".equals(extension) || ".bmp".equals(extension)) { 18 19 FileInputStream fis = new FileInputStream(source); 20 21 File targetDir = new File(savePath); 22 if (!targetDir.exists()) { 23 targetDir.mkdirs(); 24 } 25 fileName = Utils.generateRecordCode() + extension;// String.valueOf(apiResult.get("media_id")) 26 // + 27 // extension; 28 File target = new File(targetDir, fileName); 29 if (!target.exists()) { 30 target.createNewFile(); 31 } 32 33 FileOutputStream fos = new FileOutputStream(target); 34 byte[] bts = new byte[1024 * 20]; 35 while (fis.read(bts, 0, 1024 * 20) != -1) { 36 fos.write(bts, 0, 1024 * 20); 37 } 38 39 fos.close(); 40 fis.close(); 41 json.put("error", 0); 42 json.put("src", fileName); // 相对地址,显示图片用 43 source.delete(); 44 45 } else { 46 source.delete(); 47 json.put("error", 1); 48 json.put("message", "只允许上传png,jpg,jpeg,gif类型的图片文件"); 49 } 50 } catch (FileNotFoundException e) { 51 json.put("error", 1); 52 json.put("message", "上传出现错误,请稍后再上传"); 53 } catch (IOException e) { 54 json.put("error", 1); 55 json.put("message", "文件写入服务器出现错误,请稍后再上传"); 56 } catch(RuntimeException e){ 57 if(e.getMessage().contains("content length of")){ 58 json.put("error", 1); 59 json.put("message", "图片不能大于2M"); 60 }else{ 61 json.put("error", 1); 62 json.put("message", e.getMessage()); 63 } 64 } 65 setRender(new JsonRender(json.toJSONString()).forIE()); 66 }