HttpURLConnection实现文件断点续传
来源:互联网 发布:恒泰实达程序员怎么样 编辑:程序博客网 时间:2024/05/29 07:20
首先
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 ;
- }
首先创建一个空文件,接下来根据每次接收的文件流及文件长度 写入文件。
0 0
- HttpURLConnection实现文件断点续传
- HttpURLConnection方式下载文件之实现断点续传
- Libcurl实现文件断点续传
- Java实现文件断点续传
- 断点续传实现文件下载
- ASI实现文件断点续传
- python实现文件断点续传
- webuploader 实现文件断点续传
- HttpUrlConnection实现文件下载
- HttpURLConnection实现文件下载
- 断点续传,HttpURLConnection ,报文抓取
- 用HttpListener实现文件断点续传
- Android实现文件下载断点续传
- 用HttpListener实现文件断点续传
- 使用.NET实现文件断点续传
- 文件断点续传原理与实现
- 文件断点续传原理与实现
- python实现断点续传下载文件
- html和xml的转义字符
- centos 7,pip安装
- LINUX目录结构,xfsdump\xfsrestore备份恢复文件系统
- mongodb修改用户密码的2种方法
- 【DP】bzoj1002
- HttpURLConnection实现文件断点续传
- android APK反编译查阅源码
- Runnable&Callable
- Android 内功心法(1.6)——android常用设计模式之适配器模式
- 利用NSProxy解决NSTimer内存泄漏问题
- 逼格程序员—比逼格更有逼格
- (一) jsp中代替脚本的一段代码
- 如何将excel转换成word文档格式
- 其它语言项目转换为maven项目并打包成jar包