Java断点下载

参考:适应浏览器自带断点下载

/**
     * @param srcFileName
     * @param request
     * @param response
     * @return
     * @throws UnsupportedEncodingException
     */
    private Result<Object> downLoadFileBreakPoint(String srcFileName, HttpServletRequest request, HttpServletResponse response) {
        String filepath = srcFileName;
        FileInputStream inputFileStream = null;
        OutputStream outputStream = null;

        try {
            File file = new File(filepath);
            if (!file.exists()) {
                return Result.err(String.format("下载文件失败%s文件不存在!", srcFileName));
            }

            long point = 0;
            long fileLength = file.length();
            long position_end = fileLength;

            inputFileStream = new FileInputStream(file);
            outputStream = response.getOutputStream();
            response.reset();

            //设置支持断点
            response.setHeader("Accept-Ranges", "bytes");

            //获取断点位置
            String Range = request.getHeader("Range");
            if (Range != null) {
                response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
                String RangeFromTo = Range.replaceAll("bytes=", "");
                syslog.info("threadName: " + Thread.currentThread().getId() + " Range : " + RangeFromTo);
                String[] Ranges = RangeFromTo.split("-");
                point = Long.parseLong(Ranges[0]);

                if (2 == Ranges.length && !Ranges[1].equals("")) {
                    position_end = Long.parseLong(Ranges[1]);
                }
            }

            //写明要下载的文件的大小
            response.setHeader("Content-Length", Long.toString(position_end - point));
            syslog.info("threadName: " + Thread.currentThread().getId() + "point : " + point + " Content-Length : " + (position_end - point));

            //设置response的编码方式
            response.setContentType("application/x-msdownload");

            //设置断点续传回应头
            String contentRange = new StringBuffer("bytes ")
                    .append(point)
                    .append("-")
                    .append(fileLength - 1)
                    .append("/")
                    .append(fileLength)
                    .toString();

            if (point != 0) {
                // 断点续传的回应头:告诉改块插入的位置和文件的总大小
                // 格式:Content-Range: bytes [文件块的开始字节]-[文件块的结束字节 - 1]/[文件的总大小]
                contentRange = new StringBuffer("bytes ")
                        .append(point)
                        .append("-")
                        .append(position_end - 1)
                        .append("/")
                        .append(fileLength)
                        .toString();
                // 移动文件指针位置,断点处
                inputFileStream.skip(point);
            }
            response.setHeader("Content-Range", contentRange);

            //设置附加文件名(解决中文乱码)
            String downloadname = file.getName();
            response.setHeader("Content-Disposition", "attachment;filename=" + new String(downloadname.getBytes("gbk"), "iso-8859-1"));

            long bytesWritten = 0;
            byte[] bytes = new byte[1024 * 4];
            int byteCount;

            long NeedWriten = position_end - point + 1;

            while (NeedWriten >= bytesWritten && (byteCount = inputFileStream.read(bytes)) != -1) {
                if (NeedWriten >= bytesWritten) {
                    long tTempWriten = (bytesWritten + byteCount) > NeedWriten ? (NeedWriten - bytesWritten) : byteCount;
                    outputStream.write(bytes, 0, (int) tTempWriten);
                    bytesWritten += tTempWriten;
                }
            }


        } catch (FileNotFoundException e) {
            syslog.error("下载文件失败:" + filepath + " FileNotFoundException happen : " + e + " URL : " + request.getRequestURL().toString());
            return Result.err("下载文件失败:");
        } catch (IOException e) {
            syslog.error("下载文件失败:" + filepath + " IOException hapepn : " + e + " URL : " + request.getRequestURL().toString());
            return Result.err("下载文件失败:");
        } finally {
            try {
                if (null != inputFileStream) {
                    inputFileStream.close();
                }
                if (null != outputStream) {
                    outputStream.close();
                }
            } catch (IOException e) {
                syslog.error("下载文件失败:" + filepath + " EofException happen : " + e);
            }
        }
        return Result.success("下载文件成功:" + filepath);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值