松鼠的博客

导航

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

下面是一个简单的实现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-%e5%ae%9e%e7%8e%b0%e6%96%ad%e7%82%b9%e7%bb%ad%e4%bc%a0%e7%9a%84%e4%b8%8a%e4%bc%a0%e5%8a%9f%e8%83%bd/

欢迎入群一起讨论

 

 

posted on 2023-10-23 09:41  Xproer-松鼠  阅读(58)  评论(0编辑  收藏  举报