基于Java发起HTTP请求实现文件的上传

2023-11-17

需要用到的包

<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.73</version>
        </dependency>
        <!-- httpclient 相关依赖-->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpcore</artifactId>
            <version>4.4.10</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.6</version>
        </dependency>

        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpmime</artifactId>
            <version>4.5</version>
        </dependency>

后端代码以及接口见我之前发的文章:文章地址
之前的实现方式是通过html上传文件实现文件上传,而现在是基于Java实现发起http请求进行问价的上传。在本地使用Java对文件进行分片上传。

package com.dongmu.util;

import org.apache.commons.codec.digest.DigestUtils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigInteger;
import java.nio.channels.FileChannel;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.Map;

public class FileUtils {
   

    /**
     *  上传大文件到服务器
     * @param path 需要上传的文件的本地路径,不包含文件名,只需要到父路径即可
     * @param fileName  需要上传的文件的文件名
     * @param length 上传文件时候的分片的大小,不设置默认为5M
     * @throws Exception
     */
    public static void uploadBigFile(String path,String fileName,Long length) throws Exception {
   

        Long sliceLen;
        if (length==null||length<=0){
   
            sliceLen = 1024*1024*5l;
        }else {
   
            sliceLen = length;
        }

        String fileUrl = path + "/"+fileName;

        //首先获取文件的md5的值
        String md5 = DigestUtils.md5Hex(new FileInputStream(fileUrl));


        File file = new File(fileUrl);

        //获取文件的文件名
//        String fileName = file.getName();
        System.out.println("上传文件的文件名:"+fileName);


        HashMap<String,String> hashMap = new HashMap<>();
        hashMap.put("fileName",fileName);
        hashMap.put("md5",md5);



        String getResult = HttpUrlConnectionUtil.httpRequestToString("http://****/check", "GET", hashMap);

//        System.out.println(getResult);

        Map map = JsonUtil.JsonToMap(getResult);

        if (map.get("code").equals(-1)){
   
//            System.out.println(getResult);
            System.out.println("文件已经上传到服务器,无需重复上传。");
            System.out.println(map.get("msg"));
            return;
        }else if (map.get("code").equals(0)){
   
            System.out.println("该文件没有上传过下面开始上传这个文件......");
            System.out.println(map.get("msg"));

            //对文件进行分片
            FileUtils.nioSpilt(file,sliceLen);

            //对分片后的文件分别进行上传
            File upload = new File(file.getParent()+"/uploadTemp");



            File[] files = upload.listFiles();



            hashMap.put("chunks",files.length+"");

            for (int i = 0; i < files.length; i++) {
   
                hashMap.put("size",files[i].length()+"");
                hashMap.put("chunk",i+1+"");
                HttpClientUtils.UploadFileByHttpClient(files[i],"http://localhost:8080/proof/file/upload",null,hashMap);
                System.out.println("已经上传了第"+(i+1)+"个分片。"+files[i].getName());
            }

            FileUtils.deleteDirFiles(path);


            getResult = HttpUrlConnectionUtil.httpRequestToString
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于Java发起HTTP请求实现文件的上传 的相关文章

随机推荐

  • 深度剖析数据在内存中的存储(修炼内力)

    目录 一 数据类型的介绍 1 1数据大小 1 2类型的基本归类 二 整型在内存中的存储 2 1原码 反码 补码 2 2大小端介绍 2 2 1大小端的起源 2 2 2大小端的概念 2 2 3为什么会有大端和小端 2 2 4设计一个小程序来判断
  • Fedora 启动顺序

    http hi baidu com wwwkljoel item 29620217882a585b2b3e2244 The start of the Fedora fedora 系统加电或复位后 中央处理器将内存中的所有数据清零 并对内存进
  • html往下滑变成水平,HTML - 水平滑块CSS最佳方法_html_开发99编程知识库

    由於每個部分的位置已經設置為relative 意味著將relative定位到上一節 因此可以將其他部分設置為left 0 margin 0 all sections display inline flex main about profes
  • 【学】saas系统前端技术选型,需要考虑哪些方面?

    对于saas前端技术选型 可以考虑以下几个方面 框架选择 目前比较流行的前端框架有React Vue Angular等 可以根据项目需求和团队技术水平选择合适的框架 例如 如果需要高度可定制性和灵活性 可以选择React 如果需要快速开发和
  • 数学建模之灰色关联实例含代码

    参考书籍 数学建模算法与应用 一 预备 1 无量纲化处理技术 二 灰色关联的步骤 通过对某健将级女子铅球运动员的跟踪调查 获得其 1982 年至 1986 年每年好成绩及16 项专项素质和身体素质的时间序列资料 见表 2 试对此铅球运动员的
  • linux-UNIX socket

    UNIX域套接字 域套接字作为进程间通信的一种手段 值得我们研究一下 域套接字实现本地进程间通信 同样有服务端和客户端之分 一个进程作为客户端 另一个进程作为服务端 这个和TCP socket类似 但是不一样 域套接字不经过底层网络 数据结
  • LaTeX 数学公式大全!

    LaTeX 数学公式大全 这里是来自一篇教程的截图 很全面
  • java.util之ArrayList使用

    java util之ArrayList使用 一 概述 ArrayList底层实际是通过一个数组来保存数据 其默认大小为10 扩容机制为新的容量 原始容量x3 2 1 允许空值 有序 为线程不安全 可以使用迭代器遍历 里面的的元素全部都是对象
  • NoteExpress安装时问题解决

    每次安装软件我都不能一次性成功 这次遇见的是NoteExpress和Word权限不一致的问题 版本 win10 office2019 网上有很多方法 其中CSDN博主 令令狐大侠 总结郭一篇 原文链接 https blog csdn net
  • 【华为OD机试】工号不够用了怎么办 (C++ Python Java)2023 B卷

    题目描述 3020年 空间通信集团的员工人数突破20亿人 即将遇到现有工号不够用的窘境 现在 请你负责调研新工号系统 继承历史传统 新的工号系统由小写英文字母 a z 和数字 0 9 两部分构成 新工号由一段英文字母开头 之后跟随一段数字
  • 关于split截取字符时,问号的特殊情况

    有一段字符 tring str gjjxxcx gjjxx cx jsp zgzh 1010024000019 如果使用如下代码 String strArray str split gjjxx cx jsp System out print
  • 基础算法题——带分数(全排列,工具库)

    前言 这道题理解起来不难 但是要找到一个合适的方法对题目进行优化 就会相对麻烦些 蓝桥杯的题 真的到处都是坑的感觉 带分数题目 资源限制 时间限制 1 0s 内存限制 256 0MB 问题描述 100 可以表示为带分数的形式 100 3 6
  • 表单注入——sqli-labs第11~16关

    目录 第11关 0 万能账号 密码的前提 1 判断是否POST注入 2 猜测后台SQL语句 3 判断闭合符 4 查询列数 5 找显示位 6 查库名 7 查表名 8 查列名 9 找账号密码 第12关 第13关 第14关 1 2 3 4 5 6
  • Leetcode148.排序链表——排序问题详解

    文章目录 引入 归并排序解法 其他 引入 148 排序链表题目如下 148 排序链表 在 O n log n 时间复杂度和常数级空间复杂度下 对链表进行排序 示例 1 输入 4 gt 2 gt 1 gt 3 输出 1 gt 2 gt 3 g
  • 工作中常用且容易遗忘的css样式整理,建议收藏

    1 文字超出部分显示省略号 单行文本的溢出显示省略号 一定要有宽度 p width 200rpx overflow hidden text overflow ellipsis white space nowrap 多行文本溢出显示省略号 p
  • Linux(驱动编程)(调试技术)(imx6ull)

    调试技术 1 在写驱动程序时函数未包含头文件 在linux内核源码driver char目录下输入命令 grep XXXX nrw 查看次函数在那个 c里用过 然后在vscode界面下按alt p搜索这个 c就可以参考这个 c的头文件 2
  • docker笔记(二)之镜像加速器

    国内从 Docker Hub 拉取镜像有时会遇到困难 此时可以配置镜像加速器 国内很多云服务商都提供了国内加速器服务 例如 阿里云加速器 点击管理控制台 gt 登录账号 淘宝账号 gt 右侧镜像中心 gt 镜像加速器 gt 复制地址 网易云
  • 从原理到应用,人人都懂的 ChatGPT 指南

    如何充分发挥ChatGPT潜能 成为了众多企业关注的焦点 但是 这种变化对员工来说未必是好事情 IBM计划用AI替代7800个工作岗位 游戏公司使用MidJourney削减原画师人数 此类新闻屡见不鲜 理解并应用这项新技术 对于职场人来说重
  • Pytorch实现多特征输入的分类模型 代码实操

    初学者学习Pytorch系列 第一篇 Pytorch初学简单的线性模型 代码实操 第二篇 Pytorch实现逻辑斯蒂回归模型 代码实操 第三篇 Pytorch实现多特征输入的分类模型 代码实操 文章目录 初学者学习Pytorch系列 前言
  • 基于Java发起HTTP请求实现文件的上传

    需要用到的包