J2ee 断点续传 及 post请求中 包含 url参数及文件流
来源:互联网 发布:心路独舞这个公知 编辑:程序博客网 时间:2024/06/02 03:28
首先
client端:
HttpURLConnection conn = null;BufferedInputStream fin = null;BufferedOutputStream out = null;URL reqUrl;try {reqUrl = new URL("http://<ip>:<port>/Emergency/phone/attachmentUpload");conn = (HttpURLConnection) reqUrl.openConnection();conn.setConnectTimeout(3000);conn.setRequestMethod("PUT");if(isCommit){conn.setRequestProperty("isCommit", "true");}else{conn.setRequestProperty("isCommit", "false");}conn.setRequestMethod("PUT");conn.setRequestProperty("Content-Type", "binary/octet-stream");conn.setRequestProperty("offset", StringUtil.toString(offset));conn.setDoOutput(true);conn.setDoInput(true);// 1M的chunk缓冲conn.setChunkedStreamingMode(1024*1024);out = new BufferedOutputStream(conn.getOutputStream());fin = new BufferedInputStream(new FileInputStream(file));byte[] buf = new byte[bufferSizeUpload];int len = -1;long currentUploadSize = offset;fin.skip(offset);while ((len = fin.read(buf)) != -1¤tUploadSize<offset+uploadSize) {if(offset+uploadSize-currentUploadSize<bufferSizeUpload){len = Integer.parseInt(StringUtil.toString(offset+uploadSize-currentUploadSize));}if(len>0){if(out!=null){out.write(buf, 0, len);out.flush();}}currentUploadSize += len;}} catch (SocketTimeoutException e) {e.printStackTrace();} catch(IOException e){e.printStackTrace();} finally {try {if (fin != null) {fin.close();fin = null;}if (out != null) {out.close();out = null;}if (conn != null) {conn.disconnect();conn = null;}} catch (IOException ioe) {ioe.printStackTrace();throw new RuntimeException("Release resource failed.");}}
如上所示:url参数通过setRequestProperty方法放在请求头中 ,而文件流放在 body 中。
同时需要注意 HttpURLConnection.setChunkedStreamingMode 此方法保证每次文件流达到指定大小就发送一次,避免了放在缓存并一次性传输中可能遇到的数据缺失。
http://blog.csdn.net/z69183787/article/details/8186918 可参考
服务端:
public String underUpload() throws IOException{String data = request.getHeader("data"); String userInfo = request.getHeader("userInfo"); userInfo = new String(userInfo.getBytes("iso-8859-1"),"GBK");//System.out.println(data);//System.out.println(userInfo);Map<String,String> data_map = gson.fromJson(data,attachVo.data_map.getClass());if(data_map!=null) attachVo.data_map=data_map;attachVo.user = gson.fromJson(userInfo,attachVo.user.getClass());apiService.attachUpload(attachVo,new BufferedInputStream(request.getInputStream()));//response.setStatus(200);return null;}
使用的是ssh架构 ,通过getHeader 得到 url参数,通过getInputStream得到文件流,同时还要控制好编码,以防中文乱码。
至于断点续传,基本思想是通过信息头的部分 传递每次传输的文件大小,与服务器端的文件大小匹配。并通过
RandomAccessFile raFile = new RandomAccessFile(uploadFile.getAbsolutePath(), "rw");raFile.seek(uploadFile.length());
方法进行根据传输大小实时进行文件读写。
public static void saveFile(String destFilePathStr,String destFileName){try {File destFilePath = new File(destFilePathStr);if(!destFilePath.exists()){destFilePath.mkdirs();destFilePath = null;}File destFile = new File(destFilePathStr+"//"+destFileName);if(!destFile.exists()){destFile.createNewFile();}} catch (Exception e) {e.printStackTrace();}}public static long uploadFile(String offset,String destFileName,BufferedInputStream bis) throws IOException{File uploadFile = new File(destFileName);int len = 0;byte[] bt = new byte[1024];RandomAccessFile raFile = new RandomAccessFile(uploadFile.getAbsolutePath(), "rw");raFile.seek(uploadFile.length()); while ((len = bis.read(bt)) > 0){ raFile.write(bt, 0, len); } long l = raFile.length(); try { if(bis != null) bis.close(); if (raFile != null) raFile.close(); } catch (IOException e) {l = 0; e.printStackTrace();}return l ;}
首先创建一个空文件,接下来根据每次接收的文件流及文件长度 写入文件。
- J2ee 断点续传 及 post请求中 包含 url参数及文件流
- 页面请求包含中文的文件及URL--linux服务器
- java实现:http协议get和post方法的url参数请求响应及交互
- httpUrlConnection post请求 传参数 及客户端接收参数
- django中url,静态文件,POST请求的配置
- Android中模拟post表单提交,带参数及文件参数
- ios url 请求头添加参数及自定义cookie
- java获取当前请求的url地址及各参数
- 向Url发送post请求传递参数
- ajax 中 请求 post方式请求url
- eclipse中网络设置及get和post请求(get请求或者post请求)
- GET和POST请求中,url中的参数和form表单中的参数怎么区分
- URL中文字符及URL中不定参数
- 网络编程之get,post请求,文件上传及下载
- Jquery $.post()方法中 url过长及中文问题
- 获取请求URL、Cookie及文件上传处理
- Jeesite中解决GET请求及POST乱码
- Method 为POST跨域时Client端请求及server端获取client请求的参数
- SCOI2010——股票交易(单调队列DP)
- iPhone上关于相机拍照的图片的imageOrientation的问题
- Xcode,Objective-c,Cocoa的区别
- 各种stream相关内容
- WM_CREATE & WM_INITDIALOG
- J2ee 断点续传 及 post请求中 包含 url参数及文件流
- sed命令
- bash shell元字符(通配符)
- 【Python】Python学习笔记——读书心得
- 对你最好的男人,永远是还没上床的那个
- 【差分约束系统】Intervals POJ1201
- 别人欺负你,对你而言是种修行
- opencv学习笔记(二)-对xml和yaml文件的读写操作
- 大话设计模式 命令模式