Java做图片上传、文件上传、 批量上传、 Base64图片上传 。附上源码

2023-10-27

文章参考
control代码

@Controller
@RequestMapping("/uploadService/")
public class UploadServerController extends BaseController {

    private static final Logger logger = LoggerFactory.getLogger(UploadServerController.class);

    @Value("${my-file-path.root-path}")
    private String rootPath;

    @Value("${my-file-path.image-path}")
    private String imagePath;

    @Value("${my-file-path.file-path}")
    private String filePath;

    private HashMap<String, String> extMap = new HashMap<String, String>();

    public UploadServerController() {
        extMap.put("image", "gif,jpg,jpeg,png,bmp");
        extMap.put("flash", "swf,flv");
        extMap.put("media", "swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb");
        extMap.put("file", "doc,docx,xls,xlsx,ppt,pptx,htm,html,txt,zip,rar,gz,bz2");
    }

    /**
     * 上传单图片(文件流)
     * @param request
     * @param response
     * @return
     */
    @RequestMapping("uploadImg")
    @ResponseBody
    public BaseResp uploadImg(HttpServletRequest request, HttpServletResponse response, BaseReq req){
        try {
            Map<String, Object> outMap = upload(request, initFilePath(imagePath), "image");
            return BaseResp.success("上传成功",outMap);
        }catch (IOException e){
            e.printStackTrace();
            return BaseResp.validError("上传文件出现异常:"+e.getMessage());
        }catch (RuntimeException e){
            e.printStackTrace();
            return BaseResp.validError(e.getMessage());
        }
    }

    /**
     * 上传图片 Base64格式
     * @param request
     * @param response
     * @return
     */
    @RequestMapping("uploadImgBase64")
    @ResponseBody
    public BaseResp uploadImgBase64(HttpServletRequest request, HttpServletResponse response, BaseReq req){

        Map<String,Object> outMap = new HashMap<>();
        // 上传图片base64
        String imgBase64 = request.getParameter("base64Code");
        if (StringUtils.isEmpty(imgBase64)){	// 图像数据为空
            return BaseResp.validError("未获取到上传图片内容");
        }
        // 转型为MultipartHttpRequest:
        MultipartFile file = BASE64DecodedMultipartFile.base64ToMultipart(imgBase64);
        if (file == null) {
            imgBase64 = "data:image/png;base64,"+imgBase64;
            MultipartFile file2 = BASE64DecodedMultipartFile.base64ToMultipart(imgBase64);
            if (file2 == null) {
                return BaseResp.validError("图片base64格式转换失败。");
            }else{
                file = file2;
            }
        }

        // 创建保存路径
        String filePath = initFilePath(imagePath);

        String fileName = DateUtil.getFormatDate("yyyyMMddHHmmss", new Date()) + "_"
                + new Random().nextInt(1000);
        String fileRealName = file.getOriginalFilename();// 原始名称
        String[] str = fileRealName.split("\\.");
        try {
            File uploadedFile = new File(rootPath + filePath, fileName + "." + str[str.length - 1]);
            file.transferTo(uploadedFile);

            String imgUrl = filePath + fileName + "." + str[str.length - 1];
            imgUrl = imgUrl.replaceAll("\\\\", "/").replaceAll("//", "/");
            outMap.put("filePath",imgUrl);
            outMap.put("fileName", fileRealName);
            return BaseResp.success("上传成功",outMap);
        } catch (Exception e) {
            e.printStackTrace();
            logger.error(e.getMessage());
            return BaseResp.paramsError("上传文件失败。");
        }

    }

    /**
     * 批量上传图片
     * @param request
     * @param response
     * @return
     */
    @RequestMapping("uploadifyImg")
    @ResponseBody
    public BaseResp uploadifyImg(HttpServletRequest request, HttpServletResponse response, BaseReq req){
        try {
        	List<Map<String,Object>> list = uploadify(request, initFilePath(imagePath), "image");
            return BaseResp.success("上传成功",list);
        }catch (IOException e){
            e.printStackTrace();
            return BaseResp.validError("上传文件出现异常:"+e.getMessage());
        }catch (RuntimeException e){
            e.printStackTrace();
            return BaseResp.validError(e.getMessage());
        }

    }

    /**
     * 上传单文件(文件流)
     * @param request
     * @param response
     * @return
     */
    @RequestMapping("uploadFile")
    @ResponseBody
    public BaseResp uploadFile(HttpServletRequest request, HttpServletResponse response, BaseReq req){
        try {
            Map<String, Object> outMap = upload(request, initFilePath(filePath), null);
            return BaseResp.success("上传成功",outMap);
        }catch (IOException e){
            e.printStackTrace();
            return BaseResp.validError("上传文件出现异常:"+e.getMessage());
        }catch (RuntimeException e){
            e.printStackTrace();
            return BaseResp.validError(e.getMessage());
        }

    }

    /**
     * 批量上传文件
     * @param request
     * @param response
     * @return
     */
    @RequestMapping("uploadifyFile")
    @ResponseBody
    public BaseResp uploadifyFile(HttpServletRequest request, HttpServletResponse response, BaseReq req){
        try{
            List<Map<String,Object>> list = uploadify(request,initFilePath(filePath),null);
            return BaseResp.success("上传成功",list);
        }catch (IOException e){
            e.printStackTrace();
            return BaseResp.validError("上传文件出现异常:"+e.getMessage());
        }catch (RuntimeException e){
            e.printStackTrace();
            return BaseResp.validError(e.getMessage());
        }

    }

    /**
     * 文件流上传
     * @param request
     * @param filePath
     * @param type 指定上传的文件类型 如:image 类型
     * @return
     */
    public Map<String,Object> upload(HttpServletRequest request,String filePath,String type)throws RuntimeException,IOException {
        Map<String,Object> map = new HashMap<>();
        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
        Iterator<String> it = fileMap.keySet().iterator();

        while (it.hasNext()) {
            String key = (String) it.next();
            MultipartFile multipartFile = (MultipartFile) fileMap.get(key);
            String fileName = DateUtil.getFormatDate("yyyyMMddHHmmss", new Date()) + "_"
                    + new Random().nextInt(1000);
            String fileRealName = multipartFile.getOriginalFilename();// 原始名称
            String[] str = fileRealName.split("\\.");

            if(!validateFileType(fileRealName,type)){
                throw new RuntimeException("非法的文件类型.");
            }
            File uploadedFile = new File(rootPath + filePath, fileName + "." + str[str.length-1]);
            multipartFile.transferTo(uploadedFile);

            String imgUrl = filePath + fileName + "." + str[str.length - 1];
            map.put("filePath", imgUrl);
            map.put("fileName", fileRealName);
        }
        return map;
    }

    /**
     * 批量上传
     * @param request
     * @param filePath
     * @param type 指定上传的文件类型 如:image 类型
     * @return
     */
    public List<Map<String,Object>> uploadify(HttpServletRequest request,String filePath,String type)throws IOException,RuntimeException{
        List<Map<String,Object>> imagePathList = new ArrayList<>();
        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
        Iterator<String> itValidate = fileMap.keySet().iterator();
        Iterator<String> it = fileMap.keySet().iterator();

        // 先验证文件类型
        while (itValidate.hasNext()) {
            String key = (String) itValidate.next();
            MultipartFile multipartFile = (MultipartFile) fileMap.get(key);
            String fileRealName = multipartFile.getOriginalFilename();// 原始名称
            // 验证上传文件类型
            if(!validateFileType(fileRealName,type)){
                throw new RuntimeException("非法的文件类型.");
            }
        }
        while (it.hasNext()) {
            String key = (String) it.next();
            MultipartFile multipartFile = (MultipartFile) fileMap.get(key);
            String fileName = DateUtil.getFormatDate("yyyyMMddHHmmss", new Date()) + "_"
                    + new Random().nextInt(1000);
            String fileRealName = multipartFile.getOriginalFilename();// 原始名称
            String[] str = fileRealName.split("\\.");
            File uploadedFile = new File(rootPath+filePath, fileName + "." + str[str.length - 1]);
            multipartFile.transferTo(uploadedFile);
            String imgUrl = filePath + fileName + "." + str[str.length - 1];
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("filePath", imgUrl);
            map.put("fileName", fileRealName);
            imagePathList.add(map);
        }
        return imagePathList;
    }

    /**
     * 验证上传的文件类型 是否在指定的文件类型列表中
     * @param fileName
     * @param type 指定文件类型
     * @return
     */
    public boolean validateFileType(String fileName,String type){
        String fileType = fileName.substring(fileName.lastIndexOf(".")+1).toLowerCase();
        if(type!=null){
            if(extMap.containsKey(type)){
                String extType = extMap.get(type);
                String extTypes[] = extType.split(",");
                return Arrays.asList(extTypes).contains(fileType);
            }else{
                return false;
            }
        }else{
            String extType="";
            for (String value : extMap.values()) {
                extType = extType+","+value;
            }
            String extTypes[] = extType.split(",");
            return Arrays.asList(extTypes).contains(fileType);
        }
    }

    /**
     * 初始化 当天文件路径 或 文件夹
     * @param path
     */
    public String initFilePath(String path)throws RuntimeException {
        try {
            // 当天日期文件夹
            String filePath = path + DateUtil.getFormatDate("yyyyMMdd", new Date()) + "/";// 头像图片保存路径
            // 文件保存目录路径
            String savePath = rootPath + filePath;
            savePath.replaceAll("\\\\", "/").replaceAll("//", "/");

            // 根目录是否存在 不存在则创建
            File saveDirFile = new File(rootPath);
            if (!saveDirFile.exists()) {
                saveDirFile.mkdirs();
            }
            // 判断当天文件夹是否存在 不存在则创建
            File dirFile = new File(savePath);
            if (!dirFile.exists()) {
                dirFile.mkdirs();
            }
            return filePath;
        }catch (RuntimeException e){
            e.printStackTrace();
            throw new RuntimeException("创建文件异常:错误的文件路径。");
        }
    }

}



源码地址

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

Java做图片上传、文件上传、 批量上传、 Base64图片上传 。附上源码 的相关文章

  • Java:获取当前正在执行的Method对应的对象

    将当前正在执行的方法作为 Method 对象获取的最优雅的方法是什么 我的第一个明显的方法是在辅助类中使用静态方法 该方法将加载当前线程堆栈 获取正确的堆栈跟踪元素 并根据其信息构造 Method 元素 有没有更优雅的方法来实现这一目标 这
  • 如何用Java写入OS系统日志?

    Mac OS 有一个名为 Console 的应用程序 其中包含记录的消息 错误和故障 我相信 Windows 中的等效项是事件查看器 我想 Linux 上也有一个 但我不知道它是什么 也不知道它在哪里 是否可以像这样从 Java 输出获取消
  • 获取jdbc中表依赖顺序

    我在 MySQL 数据库中有一组表 A B C D 依赖关系如下 B gt C gt A 和 D gt A 也就是说 A 有一个 PrimaryKey C 有一个外键指向 A 的主键 B 有一个外键指向 C 的主键 类似地 D 有一个外键指
  • Java Sqlite Gradle

    我对 gradle 和 java 还很陌生 我有一个使用 sqlite 的项目 它通过 intellij idea 运行良好 但我无法从终端运行它 它会抛出异常 java lang ClassNotFoundException org sq
  • Java - 从配置文件加密/解密用户名和密码

    我们正忙于为客户开发 Java Web 服务 有两种可能的选择 将加密的用户名 密码存储在Web服务客户端上 从配置中读取 文件在客户端 解密并发送 将加密的用户名 密码存储在 Web 服务器上 从配置中读取 Web 服务器上的文件 解密并
  • 指纹奇异点检测

    我正在尝试确定指纹的核心点和增量点 我正在使用庞加莱指数方法 但我无法成功检测到这一点 而且我不明白为什么 First I divide the image in 15x15 blocks then I calculate the x an
  • 如何使用 Java 创建多个模式连接?

    我必须使用两个数据库 DB2 Oracle 我在 DB2 数据库中有一个名为NAVID 我想使用 Java 为 Oracle 中的所有表创建相同的架构 public class automateExport static String va
  • H264 字节流到图像文件

    第一次来这里所以要温柔 我已经在给定的 H 264 字节流上工作了几个星期 一般注意事项 字节流不是来自文件 它是从外部源实时提供给我的 字节流使用 Android 的媒体编解码器进行编码 当将流写入扩展名为 H264的文件时 VLC能够正
  • 在 Android 中绘制一条带有弯曲边缘的线

    I am using canvas drawLine to draw some line in android but the lines are too sharp but i need a curved edges 这里的 1 是我所拥
  • java中队列的实现

    在 Java 中实现队列是一个非常常见的面试问题 我在网上冲浪 看到了许多实现 他们做了一些奇特的事情 比如实现队列接口和编写自己的addLast and removeFirst 方法 我的问题是我不能使用LinkedList 类并使用其预
  • 从剪贴板获取图像 Awt 与 FX

    最近 我们的 Java FX 应用程序无法再从剪贴板读取图像 例如 用户在 Microsofts Paint 中选择图像的一部分并按复制 我不是在谈论复制的图像文件 它们工作得很好 我很确定它过去已经有效 但我仍然需要验证这一点 尽管如此
  • 更改 JTextPane 的大小

    我是Java新手 刚刚在StackOverflow中找到了这段代码 ResizeTextArea https stackoverflow com questions 9370561 enabling scroll bars when jte
  • Hystrix是否可以订阅CircuitBreaker开启事件?

    对于单元测试 我希望能够订阅 Hystrix 事件 特别是在断路器打开或关闭时发生事件 我四处寻找示例 似乎解决方法是利用指标流并监视断路器标志 由于 Hystrix 是基于 RxJava 构建的 我认为应该在某个地方有一个事件订阅接口 在
  • 用于防止滥用的 Servlet 过滤器? (DoS、垃圾邮件等)

    我正在寻找一个 Servlet 过滤器库 它可以帮助我保护我们的 Web 服务免受未经授权的使用和 DDoS 攻击 我们的网络服务有 授权客户 因此理想情况下 过滤器将帮助检测未经授权或行为不当的客户 或检测使用同一帐户的多个人 此外 我们
  • 如何使用 Spring MVC 和 Thymeleaf 添加静态文件

    我的问题是如何添加 CSS 和图像文件等静态文件 以便我可以使用它们 我正在使用 Spring MVC 和 Thymeleaf 我查看了有关此主题的各种帖子 但它们对我没有帮助 所以我才来问 根据这些帖子 我将 CSS 和图像文件放在res
  • Java 中 static 关键字如何工作?

    我正在阅读Java教程 http docs oracle com javase tutorial index html从一开始我就有一个问题static字段或变量上的关键字 作为Java said here http docs oracle
  • XSLT:我们可以使用abs值吗?

    我想知道在 XSLT 中我们是否可以使用 math abs 我在某处看到过这个 但它不起作用 我有类似的东西
  • 在多线程环境中,Collections.sort 方法有时会抛出 ConcurrentModificationException。列表没有进行结构性修改

    package CollectionsTS import java util ArrayList import java util Collections import java util HashSet import java util
  • 编译时在代码中替换Java静态最终值?

    在java中 假设我有以下内容 fileA java class A public static final int SIZE 100 然后在另一个文件中我使用这个值 fileB java import A class b Object t
  • RecyclerView 不调用 onCreateViewHolder 或 onBindView

    没有收到任何错误 所有数据似乎都有效 由于某种原因 没有调用与视图相关的方法 我已确定以下事项 getItemCount 是唯一被调用的适配器方法 并且返回一个正整数值 我知道这将是你们将要查看的区域 构造函数正在被调用 成员变量有效 Pa

随机推荐

  • 电脑wps可以语音录入吗_怎样用word进行语音录入文字

    怎样用 word 进行语音录入文字 有时候我们不方便手敲键盘输入时 可以利用 word 的语音录入功能进行输入 以下是学习啦小编为您带来的关于用 Word 进行语音录入文字 希望对您有所帮助 用 Word 进行语音录入文字 语音输入功能添加
  • 最适合程序猿的笔记软件

    因为这几天小编要去听课 所以心血来潮找了几个适合程序猿的笔记软件 经过几天在csdn上的扒饭之后 我结合自己的某些要求 为大家整理出了这几个软件 有需要直接去后面找 一 必须支持markdown markdown的重要性不需要在这里多说了吧
  • TypeScript 联合类型(union type)

    TS是JS的超集 在JS的基础上添加了一套类型系统 这样的TS可以被静态分析带来的好处显而易见 let val string val 声明一个string类型的变量val let val string val val 1 Type numb
  • hive异常MetaException-Metastore contains multiple versions

    在执行hive运行脚本时 出现了MetaException Metastore contains multiple versions异常错误 Exception in thread main java lang RuntimeExcepti
  • Java 手动分页

    功能需求背景 今天负责短信后台定时任务时 需要定时向用户发送短信信息 但数据库记录的待发送记录数量比较大 无法一次查询出结果 需要手动分页 手动分页核心功能代码 Date now DateUtils getBeforeMouth new D
  • Arduino基本知识

    analogWrite 将一个模拟数值写进Arduino引脚 这个操作可以用来控制LED的亮度 或者控制电机的转速 Arduino每一次对引脚执行analogWrite 指令 都会给该引脚一个固定频率的PWM信号 digitalRead 读
  • 基于FPGA的图像采集之二 GEN_FRAME(成帧)模块

    距离上次的博客已经有段时间了 这写些日子一直在调SDRAM的模块以及文档的书写 SDRAM的子模块比较多 包括init 初始化模块 refresh 刷新模块 write 写模块 read 读模块 使用起来相比之前的USB控制模块 今天的GE
  • JAVA中队列,数据结构队列入队操作

    java中构造函数和构造方法的区别 Java中什么是构造函数 构造函数和普通函数的区别如下 1 写法上的不同 施工方法 Public modifier class 定义类的关键字 Test 类名 没有参数 测试 类名 接受一个参数 测试 类
  • 使用Visual Studio写一个简单的Windows窗体应用登录界面

    需要的知识 C 的基本语法 以及Visual Studio的基本操作方法 编辑软件 Sql Server 2017 Visual Studio 2017 前提 Sql Server 中有一个名为 MY LAPTOP 的服务器 一个名为 Te
  • 初学(9)——Hadoop错误:ssh: Could not resolve hostname master: Name or service not known

    进行ssh访问时出现错误 ssh Could not resolve hostname master Name or service not known 解决方法 修改hosts文件 将名称和IP建立联系 1 打开 etc目录下hosts文
  • 深入理解Go——context(2)

    文章目录 结构体 emptyCtx cancleCtx timerCtx valueCtx 结构体 emptyCtx 源码中定义了 Context 接口后 并且给出了一个实现 type emptyCtx int func emptyCtx
  • Spring Boot 实现各种参数校验

    目录 1 简单使用 1 引入依赖 2 requestBody参数校验 3 requestParam PathVariable参数校验 4 统一异常处理 2 进阶使用 1 分组校验 2 嵌套校验 3 集合校验 4 自定义校验 5 编程式校验
  • 完整的微信小程序支付开发记录(亲测)

    这次呢是开发小程序的支付功能 因为没有做过 特此记录 做一个小总结 以便以后使用以及给小伙伴们提供一个像我一样的小白一个参考 我也是一点一点摸索过来的 此文只针对开发支付流程而言以及出现的问题 其它则会略过 只讲解实际动手开发过程 名词和实
  • findbugs错误总结

    本篇是从别人那找到的 为了让我回头查看findbugs错误怎么解决而保存的 有很多问题其实挺隐晦的 比如第三条 还有人会使用 来判断常量字符串和String类型是否相等 这个就是基础不牢的缘故了 记得把findbugs尽量清零哦 1 NP
  • 简单的postgersql存储过程样例

    建表 CREATE TABLE Employees Id serial Name VARCHAR 100 DateOfBirth Date City VARCHAR 100 Designation VARCHAR 100 JoiningDa
  • 小米r3g openwrt软件源,换源

    小米r3g openwrt软件源 换源 自带的源不好用 自己找了一个 还是在中科大源站上改的 中科大这个网站上的资源太多了 ssh登录后替换 etc opkg distfeeds conf 里面的源地址 也可能是 etc opkg conf
  • 【Android】[2] 如何制作启动倒计时页

    前言 实现效果 源码地址 https github com littlecurl AppProjects 进去找AndroidCountDown或者AndroidCountDown zip进行下载 前提条件 红黑联盟 Android性能优化
  • Numpy中的排序(sort,argsort)

    按索引排序 gt gt import numpy as np gt gt x np array 0 12 48 4 14 18 1 7 99 灵活应用索引和切片实现按索引的排序 倒序的实现 普通列表也可用reverse实现 numpy则没有
  • VMware开启虚拟机无法正常开机(100%解决)

    发现自己的WMware上部署的虚拟机都无法开机 VMware Workstation 与 Device Credential Guard 不兼容 在禁用 Device Credential Guard 后 可以运行 VMware Works
  • Java做图片上传、文件上传、 批量上传、 Base64图片上传 。附上源码

    文章参考 control代码 Controller RequestMapping uploadService public class UploadServerController extends BaseController privat