`

Android 之 Http URLConnection 上传文件

 
阅读更多

class  myThread  implements Runnable{

		@Override
		public void run() {
			try {
				File file = compressPicture(imagePath);
				Map<String,String> entryText = new HashMap<String,String>();
				String lgtd="",lttd="",tptime="";
				try {
					float[] output = new float[2];
					ExifInterface exif = new ExifInterface(imagePath);
					exif.getLatLong(output);
					lttd = ""+output[0];
					lgtd = ""+output[1];
					tptime = PeaceUtil.parseDate(exif.getAttribute(ExifInterface.TAG_DATETIME)); //格式化拍照时间
				} catch (IOException e) {
					e.printStackTrace();
				}
				//取出图片信息
				int len=imagePath.lastIndexOf("/");
				Editor  editor=sp_userParam.edit();
				entryText.put("filename", imagePath.substring(len+1));          
				entryText.put("lgtd", lgtd==null?"0":lgtd);    			        //经度
				entryText.put("lttd", lttd==null?"0":lttd);    				    //维度
				entryText.put("tm", tptime);    							    //拍照时间 
				entryText.put("opeator", imagerView.getText().toString());      //拍照人
				String  useridString=sp_userParam.getString("USERID", null);
				entryText.put("userid", useridString.substring(1,useridString.length()-1));							//用户ID
				entryText.put("eventsource", eventName);                        //事件来源
				entryText.put("intro", imageInfoView.getText().toString());     //照片描述
				/***************************************************************/
				FileInfo fileinfo = new FileInfo(file);
				List<FileInfo> list = new ArrayList<FileInfo>();
				list.add(fileinfo);
				int result=0;
			    result = PostFile.getInstance().post(Const.uploadUrl, entryText, list);	
				Message msg = new Message();
				msg.what = result;
				handler.sendMessage(msg);
			} catch (Exception e) {
				dialog.dismiss();
				e.printStackTrace();
			}
		}
	}








      	private final static String LINEND = "\r\n";
	private final static String BOUNDARY = "---------------------------7da2137580612"; //数据分隔线
	private final static String PREFIX = "--";
	private final static String MUTIPART_FORMDATA = "multipart/form-data";
	private final static String CHARSET = "utf-8";
	private final static String CONTENTTYPE = "application/octet-stream";

	/**
	 * HTTP上传单个文件
	 * @param actionUrl  请求服务器的路径
	 * @param params     传递的表单内容
	 * @param files      单个文件信息
	 * @return
	 */
	public int post(String actionUrl,Map<String,String> params,List<FileInfo> fileInfos){
		Log.i("post-------------", "postfile");
		HttpURLConnection urlConn = null;
		BufferedReader br = null;
		try {
             //新建url对象
			URL url = new URL(actionUrl);
			//通过HttpURLConnection对象,向网络地址发送请求
			urlConn = (HttpURLConnection)url.openConnection();
			
			//设置该连接允许读取
			urlConn.setDoOutput(true);   
			//设置该连接允许写入
			urlConn.setDoInput(true);   
			//设置不能适用缓存
			urlConn.setUseCaches(false);
			//设置连接超时时间
			urlConn.setConnectTimeout(3000);   //设置连接超时时间
			//设置读取时间
			urlConn.setReadTimeout(4000);   //读取超时
			//设置连接方法post
			urlConn.setRequestMethod("POST");
			//设置维持长连接
			urlConn.setRequestProperty("connection", "Keep-Alive");
			//设置文件字符集
			urlConn.setRequestProperty("Charset", CHARSET);
			//设置文件类型
			urlConn.setRequestProperty("Content-Type", MUTIPART_FORMDATA+";boundary="+BOUNDARY);
			/********************************************************************/		
			DataOutputStream dos = new DataOutputStream(urlConn.getOutputStream());
			//构建表单数据
			String entryText = bulidFormText(params);

			dos.write(entryText.getBytes());
			int index = 1;
			for (FileInfo fileInfo : fileInfos){
				StringBuffer sb = new StringBuffer("");
				sb.append(PREFIX+BOUNDARY+LINEND)				 
				  .append("Content-Disposition: form-data;" +
				  		" name=\""+fileInfo.getFileTextName()+(++index)+"\";" +
				  		" filename=\""+fileInfo.getImgFile().getAbsolutePath()+"\""+LINEND)
				  .append("Content-Type:"+CONTENTTYPE+";" +
				  		  "charset="+CHARSET+LINEND)
				  .append(LINEND);

				dos.write(sb.toString().getBytes());
				
				FileInputStream fis = new FileInputStream(fileInfo.getImgFile());
				
				byte[] buffer = new byte[10000];
	            int len = 0;
	            while ((len = fis.read(buffer)) != -1) {
	            	dos.write(buffer, 0, len);
	            }
	            dos.write(LINEND.getBytes());
	            fis.close();
			}
			//请求的结束标志
			byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes();
			dos.write(end_data);
			dos.flush();
			dos.close();
	        // 发送请求数据结束  
			
			//接收返回信息 	
			int code = urlConn.getResponseCode();
			if(code!=200){
				urlConn.disconnect();
				return code;
			}else{
				br = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));
				String result = "";
				String line = null;
				while((line = br.readLine())!=null){
					result += line;
				}
				Log.i("post-------------", result);
				if("true".equals(result)){
					return 200;
				}else{
					return 500;
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
			Log.e("--------上传图片错误--------", e.getMessage());
			return -1;
		}finally{
			try {
				if(br!=null){
					br.close();
				}
				if(urlConn!=null){
					urlConn.disconnect();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	



上传文件的Http 请求信息分为4种

1、分界符

    -- +"-------------数字"+"\r\n"
2、上传文件的相关信息
    a-请求的参数名 b-上传的文件名 c-文件类型 d-
    Content-Disposition:form-data;
    name="file";
    filename="abc.jpg"
3、上传文件内容的字节流形式
    Content-type:application/octet-stream
          charset:utf-8
4、文件全部上传完成后的结束符
       -- +"-------------数字"+ -- +"\r\n"


服务器上传接口URL源码

	/**
	 * 上传图片
	 * @return
	 */
	@RequestMapping(value="/image/upload",method={RequestMethod.POST})
	public @ResponseBody Boolean imageUpload(MultipartHttpServletRequest request,Timestamp tm){
		
		String userid = request.getParameter("userid");
		String intro = request.getParameter("intro");
		String mmtype = request.getParameter("mmtype");
		String eventsource = request.getParameter("eventsource");
		String opeator = request.getParameter("opeator");
		Double lgtd = NumberUtils.toDouble(request.getParameter("lgtd"), 0);
		Double lttd = NumberUtils.toDouble(request.getParameter("lttd"), 0);
		String ftypetime = sdf.format(new Date());
		//List<MultipartFile> imgFiles = request.getFiles("imgFile");
		Map<String,MultipartFile> fileMap = request.getFileMap();
		if(fileMap==null || fileMap.isEmpty()) return false;
		int index = 0;


		for(Entry<String, MultipartFile> entry: fileMap.entrySet()){
			MultipartFile imgFile = entry.getValue();
			//UUID标示符
			String uid = UUID.randomUUID().toString();
			MobilePhoto mp = new MobilePhoto();
			String filename = sdf.format(new Date())
								+"."+StringUtils.getFilenameExtension(imgFile.getOriginalFilename());
			mp.setFilename(filename);
			mp.setTm(tm);
			mp.setLgtd(lgtd);
			mp.setLttd(lttd);
			mp.setUserid(userid);
			mp.setIntro(intro);
			mp.setEventsource(eventsource);
			mp.setId(uid);
			mp.setUploadtm(new Timestamp(System.currentTimeMillis()));
			mp.setOpeator(opeator);
			mp.setMmtype(StringUtils.hasText(mmtype) ? mmtype : "image/png");
			mp.setFtype(StringUtils.hasText(mmtype) && mmtype.indexOf("video") >= 0 ? "20" : "10");
			mp.setFtypetime(ftypetime);
			try {
				BufferedImage src = javax.imageio.ImageIO.read(imgFile.getInputStream());
				if(src != null){ //图片
					mp.setWidth(src.getWidth());   //图片宽度
					mp.setHeight(src.getHeight());  //图片高度
				}else{  //视频
					mp.setWidth(0);
					mp.setHeight(0);
				}
				mp.setPhotostream(imgFile.getBytes());
				riService.addMobilePhoto(mp);
				index++;
			} catch (IOException e) {
				log.error(e);
			}
		}
		return index==0 ? false : true;
	}
	

0
0
分享到:
评论

相关推荐

    Android与Internet接轨案例源代码

    8.11 将手机文件上传至网站服务器——模拟HTTPFORM的POSTACTION 8.12 移动博客发布器——以XML-RPC达成远程过程调用 8.13 移动RSS阅读器——利用SAXParser解析XML 8.14 远程下载安装Android程序——APKInstaller的...

    Google Android SDK开发范例大全(PDF高清完整版1)(4-1)

    8.11 将手机文件上传至网站服务器——模拟HTTPFORM的POSTACTION 8.12 移动博客发布器——以XML-RPC达成远程过程调用 8.13 移动RSS阅读器——利用SAXParser解析XML 8.14 远程下载安装Android程序——APKInstaller的...

    Google Android SDK开发范例大全(PDF完整版4)(4-4)

    8.11 将手机文件上传至网站服务器——模拟HTTPFORM的POSTACTION 8.12 移动博客发布器——以XML-RPC达成远程过程调用 8.13 移动RSS阅读器——利用SAXParser解析XML 8.14 远程下载安装Android程序——APKInstaller的...

    Google Android SDK开发范例大全(PDF高清完整版3)(4-3)

    8.11 将手机文件上传至网站服务器——模拟HTTPFORM的POSTACTION 8.12 移动博客发布器——以XML-RPC达成远程过程调用 8.13 移动RSS阅读器——利用SAXParser解析XML 8.14 远程下载安装Android程序——APKInstaller的...

    Google Android SDK开发范例大全的目录

    8.11 将手机文件上传至网站服务器——模拟HTTPFORM的POSTACTION 8.12 移动博客发布器——以XML-RPC达成远程过程调用 8.13 移动RSS阅读器——利用SAXParser解析XML 8.14 远程下载安装Android程序——APKInstaller的...

    Google Android SDK开发范例大全(完整版附部分源码).pdf

    8.11 将手机文件上传至网站服务器——模拟HTTPFORM的POSTACTION 8.12 移动博客发布器——以XML-RPC达成远程过程调用 8.13 移动RSS阅读器——利用SAXParser解析XML 8.14 远程下载安装Android程序——APKInstaller...

    Google Android SDK 开发范例大全01

    8.11 将手机文件上传至网站服务器——模拟HTTPFORM的POSTACTION 8.12 移动博客发布器——以XML-RPC达成远程过程调用 8.13 移动RSS阅读器——利用SAXParser解析XML 8.14 远程下载安装Android程序——APKInstaller的...

    Google Android SDK 开发范例大全02

    8.11 将手机文件上传至网站服务器——模拟HTTPFORM的POSTACTION 8.12 移动博客发布器——以XML-RPC达成远程过程调用 8.13 移动RSS阅读器——利用SAXParser解析XML 8.14 远程下载安装Android程序——APKInstaller的...

    Google+Android+SDK开发范例大全

    8.11 将手机文件上传至网站服务器——模拟HTTPFORM的POSTACTION 8.12 移动博客发布器——以XML-RPC达成远程过程调用 8.13 移动RSS阅读器——利用SAXParser解析XML 8.14 远程下载安装Android程序——APKInstaller的...

    Google Android sdk 开发范例大全 部分章节代码

    8.11 将手机文件上传至网站服务器——模拟HTTPFORM的POSTACTION 8.12 移动博客发布器——以XML-RPC达成远程过程调用 8.13 移动RSS阅读器——利用SAXParser解析XML 8.14 远程下载安装Android程序——APKInstaller的...

    Google Android SDK开发范例大全(完整版)

    8.11 将手机文件上传至网站服务器——模拟HTTPFORM的POSTACTION 8.12 移动博客发布器——以XML-RPC达成远程过程调用 8.13 移动RSS阅读器——利用SAXParser解析XML 8.14 远程下载安装Android程序——APKInstaller的...

    xUtils3.jar最火的网络框架

    xUtils支持超大文件(超过2G)上传,更全面的http请求协议支持(11种谓词),拥有更加灵活的ORM,更多的事件注解支持且不受混淆影响; xUtils 最低兼容Android 4.0 (api level 14); xUtils3变化较多所以建立了新的项目...

    xUtils3-master

    xUtils 支持超大文件(超过2G)上传,更全面的http请求协议支持(11种谓词),拥有更加灵活的ORM,更多的事件注解支持且不受混淆影响... xUtils 最低兼容Android 4.0 (api level 14) xUtils3变化较多所以建立了新的...

    xUtils 3.2

    xUtils 支持超大文件(超过2G)上传,更全面的http请求协议支持(11种谓词),拥有更加灵活的ORM,更多的事件注解支持且不受混淆影响... xUtils 最低兼容Android 4.0 (api level 14). (Android 2.3?) xUtils3变化较多...

    xUtils3:Android orm,位图,http,视图注入。

    2. http(s) :基于UrlConnection,Android4.4之后可以为okHttp实现。 请求协议支持11种谓词:GET,POST,PUT,PATCH,HEAD,MOVE,COPY,DELETE,OPTIONS,TRACE,CONNECT 支持超大文件(超过2G)上传 支持断点下载...

    xUtils3-3.2.2

    xUtils 支持超大文件(超过2G)上传,更全面的http请求协议支持(11种谓词),拥有更加灵活的ORM,更多的事件注解支持且不受混淆影响... xUtils 最低兼容Android 4.0 (api level 14). (Android 2.3?) xUtils3变化较多...

    xutils-3.1.0.jar包下载

    * xUtils 支持超大文件(超过2G)上传,更全面的http请求协议支持(11种谓词),拥有更加灵活的ORM,更多的事件注解支持且不受混淆影响... * xUtils 最低兼容Android 4.0 (api level 14). ([Android 2.3?]...

    xutils 3.1.2最新版本jar包下载

    * xUtils 支持超大文件(超过2G)上传,更全面的http请求协议支持(11种谓词),拥有更加灵活的ORM,更多的事件注解支持且不受混淆影响... * xUtils 最低兼容Android 4.0 (api level 14). ([Android 2.3?]...

Global site tag (gtag.js) - Google Analytics