HTTP大文件分片(分流)上传

ango907 2017-10-24 10:58:20
JAVA服务器端500MB文件如何分流为每200MB进行HTTP数据传输?
...全文
1082 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
风之诗- 2017-10-24
  • 打赏
  • 举报
回复
在本地你就可以通过IO流进行文件分块,传输过去后那边通知文件编号再使用IO流合并为一个文件就行了
ango907 2017-10-24
  • 打赏
  • 举报
回复
如下代码如何进行分流改造:

private String UploadVideo(Map<String, String> tmpMap,String tPathName) throws ClientProtocolException, IOException {
        // 返回tETag
        String tETag = "";
        // 连接
        HttpURLConnection conn = null;
        // 传递参数
        OutputStreamWriter tStreamWriter = null;
        // 接受参数
        InputStream tInputStream = null;

        String nextLine = "\r\n";
        String dividerStart = "--";
        String BOUNDARY = "******8888668ec";

        try{
            URL url = new URL(tmpMap.get("url"));
            conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("PUT");// 提交模式
            conn.setConnectTimeout(DI_CommonType.ConnectTimeout);// 连接超时 单位毫秒
            conn.setDoOutput(true);// 是否输入参数
            conn.setDoInput(true); // 是否接收参数
            conn.setUseCaches(false);// 是否缓存
            conn.setRequestProperty("Connection", "Keep-Alive");
            conn.setRequestProperty("Charset","UTF-8");
            conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.6)");
            // 分界符
            conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);
            // 定义写入数据流
            DataOutputStream tDataOutputStream = new DataOutputStream(conn.getOutputStream());
            tDataOutputStream.writeBytes(dividerStart + BOUNDARY + nextLine);
            //设置与上传文件相关的信息
            tDataOutputStream.writeBytes("Content-Disposition: form-data; name=\"file\"; filename=\""
                    + tFilePathc.substring(tFilePathc.lastIndexOf("/") + 1) + "\"" + nextLine);
            tDataOutputStream.writeBytes(nextLine);
            FileInputStream fis = new FileInputStream(tFilePathc);
            byte[] buffer = new byte[1024 * 32];
            int count;
            // 读取文件内容,并写入OutputStream对象
            while ((count = fis.read(buffer)) != -1) {
                tDataOutputStream.write(buffer, 0, count);
            }
            fis.close();
            tDataOutputStream.writeBytes(nextLine);
            tDataOutputStream.writeBytes(dividerStart + BOUNDARY + dividerStart + nextLine);
            tDataOutputStream.flush();

            // 接收参数
            int tResponseCode = conn.getResponseCode();
            Map<String,List<String>> headerFields = conn.getHeaderFields();
            System.out.println(headerFields.get("ETag"));

            if (200==tResponseCode) {
                tETag = headerFields.get("ETag").toString();
            }

        }catch(IOException e){
            try {
                System.out.println(conn.getResponseCode());
            } catch (IOException e1) {
                e1.printStackTrace();
            }
//            e.printStackTrace();
            System.out.println("通信异常!+++");
        }finally {
            try {
                if (null!=tStreamWriter) {
                    tStreamWriter.close();
                }
                if (null!=tInputStream) {
                    tInputStream.close();
                }
                if (null!=conn) {
                    conn.disconnect();
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
        return tETag;
    }
本门课程是带大家进入微服务领域入门的课程,很适合新手小白学习的课程。1: 什么是rpc?RPC(Remote Procedure Call)是函数对函数的远程调用,传输协议tcp,http,主要是基于xml,json序列化协议(这里的序列化协议是对数据编解码的方式),项目中我们真正用到的是grpc,grpc是一个框架,基于http2.0的长链接,性能有所改进,重要的是grpc用的是Google开源的protobuf序列化协议,它比json,xml性能更快,在压缩数据方面也更小。总之我们选择grpc最主要的有两点:1:支持跨语言开发(如python,golang,java)2:  grpc首先是一个框架,封装rpc,让程序员只关注代码逻辑即可 2: 为什么用grpc,而不用flask,django,tornado,即http协议?1:http的调用是根据url的(即restful),它跟rpc的调用最大的区别就是这里,rpc的调用,你就像调用一个本地函数一样简单,而且微服务,分布式也是从rpc开始的,学好rpc对以后做好分布式会更有帮助,其实go语言和python语言里都有rpc(如xmlrpc,jsonrpc,zerorpc),我们之所以学习go语言里的rpc是因为go语言的rpc相对更加灵活,go语言本身也支持高并发,这一点对于分布式来说更好。2:其次http协议,用过flask框架的人都知道,请求一次数据后就断开,而grpc基于http2.0,它不但可以保持长链接,传输效率也更高,使用方面,因为http2.0相当于tcp一样使用,现在很多大厂也都开始用http2.0了。http2.0相比http的优势很明显,头部压缩,分流,针对tcp的多路复用。所以基于http2.0的grpc无论从生态和性能方面都更好。 这张图是一个gRPC相关的架构图,同学们可以通过这张图了解gRPC在项目中的使用。

50,539

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧