首页 > 编程语言 >java 实现断点续传的上传功能

java 实现断点续传的上传功能

时间:2023-11-24 10:33:08浏览次数:40  
标签:raf 断点续传 java String HttpURLConnection responseCode 上传 conn

下面是一个简单的实现Java断点续传上传功能的代码示例,其中使用了HttpURLConnection和RandomAccessFile类:

public class ResumableUploader {
    private static final int BUFFER_SIZE = 4096;
    private static final String FILE_PATH = "yourFilePath";
    private static final String UPLOAD_URL = "yourUploadUrl";
    private static final int MAX_NUM_RETRIES = 5;
    public static void main(String[] args) throws Exception {
        File file = new File(FILE_PATH);
        // 获取文件大小
        long fileSize = file.length();
        // 创建 HttpURLConnection
        HttpURLConnection conn = (HttpURLConnection) new URL(UPLOAD_URL).openConnection();
        // 设置请求头信息
        conn.setRequestMethod("POST");
        conn.setConnectTimeout(10000);
        conn.setReadTimeout(10000);
        conn.setDoOutput(true);
        conn.setRequestProperty("Content-Type", "application/octet-stream");
        conn.setRequestProperty("Content-Length", String.valueOf(fileSize));
        // 获取已上传的文件大小
        long uploadedSize = 0L;
        String range = conn.getRequestProperty("Range");
        if (range != null) {
            String[] rs = range.substring("bytes=".length()).split("-");
            uploadedSize = Long.parseLong(rs[0]);
        }
        // 设置请求体
        OutputStream os = conn.getOutputStream();
        RandomAccessFile raf = new RandomAccessFile(file, "r");
        raf.seek(uploadedSize);
        byte[] buffer = new byte[BUFFER_SIZE];
        int bytesRead;
        while ((bytesRead = raf.read(buffer)) != -1) {
            os.write(buffer, 0, bytesRead);
        }
        os.close();
        raf.close();
        // 处理响应
        int responseCode = conn.getResponseCode();
        if (responseCode == HttpURLConnection.HTTP_OK || responseCode == HttpURLConnection.HTTP_CREATED) {
            System.out.println("文件上传成功!");
        } else {
            System.out.println("文件上传失败,响应码:" + responseCode);
            int numRetries = 0;
            while (responseCode >= 500 && responseCode < 600 && numRetries < MAX_NUM_RETRIES) {
                System.out.println("服务器错误,正在重新上传...");
                Thread.sleep(5000);
                conn = (HttpURLConnection) new URL(UPLOAD_URL).openConnection();
                conn.setRequestProperty("Content-Type", "application/octet-stream");
                conn.setRequestProperty("Content-Length", String.valueOf(fileSize));
                conn.setRequestProperty("Range", "bytes=" + uploadedSize + "-");
                os = conn.getOutputStream();
                raf = new RandomAccessFile(file, "r");
                raf.seek(uploadedSize);
                buffer = new byte[BUFFER_SIZE];
                bytesRead = 0;
                while ((bytesRead = raf.read(buffer)) != -1) {
                    os.write(buffer, 0, bytesRead);
                }
                os.close();
                raf.close();
                responseCode = conn.getResponseCode();
                numRetries++;
            }
            if (responseCode == HttpURLConnection.HTTP_OK || responseCode == HttpURLConnection.HTTP_CREATED) {
                System.out.println("文件上传成功!");
            } else {
                System.out.println("文件上传失败,响应码:" + responseCode);
            }
        }
    }
}

注:该代码仅供参考,实际使用时需要根据具体业务需求进行修改。

 

参考文章:http://blog.ncmem.com/wordpress/2023/10/23/java-实现断点续传的上传功能/


标签:raf,断点续传,java,String,HttpURLConnection,responseCode,上传,conn
From: https://blog.51cto.com/u_14023400/8544995

相关文章

  • js 大文件切片,中止上传,上传进度,断点续传
    大文件切片上传背景介绍:当涉及大文件上传时,一种有效的方法是将大文件分割成小切片并逐个上传。这种技术不仅可以减轻服务器的负担,还可以避免上传过程中的中断和内存问题。本文将介绍如何使用JavaScript实现大文件切片上传,并解释如何处理断点续传、并发控制以及上传取消等问题,用到的......
  • 详解vue大文件视频切片上传的处理方法
    前端上传大文件、视频的时候会出现超时、过大、很慢等情况,为了解决这一问题,跟后端配合做了一个切片的功能,接下来就详细的给大家介绍一下vue大文件视频切片上传的处理方法,需要的朋友可以参考下 前端上传大文件、视频的时候会出现超时、过大、很慢等情况,为了解决这一问题,跟后端......
  • 基于html5+javascript技术开发的房贷利率计算器,买房的码农们戳进来
    房贷计算器是一款专为购房者设计的实用工具应用,其主要功能是帮助用户详细计算房贷的还款金额、利息以及还款计划等。通过这款软件,用户可以更加便捷地了解到自己的还款情况和计划,从而更好地规划自己的财务。下面将对房贷计算器进行详细的介绍。体验地址房贷计算器体验地址关键代码<t......
  • Java中如何比较两个日期的大小
    日期比较1.自定义时间与当前时间比较代码展示 运行结果 2.两个自定义时间比较代码展示 运行结果 ......
  • java实现大文件的分片上传与下载(springboot+vue3)
    1.1项目背景对于超大文件上传我们可能遇到以下问题•大文件直接上传,占用过多内存,可能导致内存溢出甚至系统崩溃•受网络环境影响,可能导致传输中断,只能重新传输•传输时间长,用户无法知道传输进度,用户体验不佳1.2项目目标对于上述问题,我们需要对文件做分片传输。分片传输就是......
  • java中ArrayList和LinkedList的区别
    Java中ArrayList和LinkedList都是List集合的实现类,它们都可以用来存储一组有序的元素,但是它们的内部实现方式不同,在使用时也有不同的适用场景。ArrayList是一个基于动态数组的实现,它可以容纳任何类型的对象,并且允许对元素进行随机访问。当添加或者删除元素时,ArrayList需要移动内......
  • Java开发者的Python快速进修指南:面向对象基础
    当我深入学习了面向对象编程之后,我首先感受到的是代码编写的自由度大幅提升。不同于Java中严格的结构和约束,Python在面向对象的实现中展现出更加灵活和自由的特性。它使用了一些独特的关键字,如self和cls,这些不仅增强了代码的可读性,还提供了对类和实例的明确引用。正如Java,Python也......
  • Java设计模式之单例模式
    单例模式(SingletonPattern)是一种常用的设计模式,它用于限制一个类只能创建一个实例,并提供一个全局访问点。在Java中,实现单例模式的关键点包括:私有的构造函数:为了防止其他类创建该类的实例,我们需要将构造函数设为私有。静态的实例变量:我们需要一个静态的变量来存储该类的唯一......
  • java-策略模式
    使用原因:  需求:同一套系统,使用不同的资源,例如A使用阿里的OSS,B使用腾讯的OSS,使用配置的方式实现动态选择哪个资源策略模式示例  做个例子:比如去服装店买衣服,普通会员不打折,黄金会员打9折,铂金会员打8折,钻石会员打7折,这样不同的客户价格计算方式不同,这个时候就可以使用策略模......
  • Java算法练习—递归/回溯
    递归是一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。因此递归过程,最重要的就是查看能不能将原本的问题分解为更小的子问题,这是使用递归的关键。如果是线型递归,子问题直接回到父问题......