java动态上传图片_Java实现图片文件上传

2023-10-28

Java实现后台图片上传,将上传图片的接口进行分层,便于维护接口。

接口部分(interface)

将接口分为单图片上传以及多图片上传

public interface FileUploadService {

//单图片上传

PicUploadResult uplodadImg(MultipartFile uploadFile, HttpServletRequest request);

//多图片上传

PicUploadResult uploadManyImg(MultipartFile[] uploadFile, HttpServletRequest request);

}

接口实现类(interface impl)

上传图片方法类(主要)

上传多个图片只是使用了数组的方式将文件存到MultipartFile里面。以防代码冗余,所以将实现方法抽出来

/**

* 上传图片方法类

* @param multipartFile

* @param request

* @return

*/

private PicUploadResult uploadImgMethod(MultipartFile multipartFile, HttpServletRequest request) {

PicUploadResult picUploadResult = new PicUploadResult();

if (multipartFile.isEmpty()) {

//返回选择文件提示

picUploadResult.setLegal(false);

return picUploadResult;

}

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd/");

String format = sdf.format(new Date());

//存放上传文件的文件夹

File file = new File(baseFilePath + format);

logger.info("-----------存放上传文件的文件夹【" + file + "】-----------");

logger.info("-----------输出文件夹绝对路径 -- 这里的绝对路径是相当于当前项目的路径而不是“容器”路径【" + file.getAbsolutePath() + "】-----------");

if (!file.isDirectory()) {

//递归生成文件夹

file.mkdirs();

}

//获取原始的名字 original:最初的,起始的 方法是得到原来的文件名在客户机的文件系统名称

String oldName = multipartFile.getOriginalFilename();

logger.info("-----------文件原始的名字【" + oldName + "】-----------");

String newName = UUID.randomUUID().toString() + oldName.substring(oldName.lastIndexOf("."), oldName.length());

logger.info("-----------文件要保存后的新名字【" + newName + "】-----------");

try {

//构建真实的文件路径

File newFile = new File(file.getAbsolutePath() + File.separator + newName);

//转存文件到指定路径,如果文件名重复的话,将会覆盖掉之前的文件,这里是把文件上传到 “绝对路径”

multipartFile.transferTo(newFile);

String filePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + "/picbook/" + UPLOAD_PATH_PREFIX + format + newName;

logger.info("-----------【" + filePath + "】-----------");

picUploadResult.setLegal(true);

picUploadResult.setImgPath(filePath);

return picUploadResult;

} catch (Exception e) {

e.printStackTrace();

}

picUploadResult.setLegal(false);

return picUploadResult;

}

esult uplodadImg(MultipartFile multipartFile, HttpServletRequest request) {

return uploadImgMethod(multipartFile, request);

}

public PicUploadResult uploadManyImg(MultipartFile[] uploadFile, HttpServletRequest request) {

List imgPaths = new ArrayList<>();

for (MultipartFile multipartFile : uploadFile) {

PicUploadResult picUploadResult = uploadImgMethod(multipartFile, request);

if(picUploadResult.isLegal()){

imgPaths.add(picUploadResult.getImgPath());

}else{

return picUploadResult;

}

}

PicUploadResult picUploadResult = new PicUploadResult();

picUploadResult.setLegal(true);

picUploadResult.setImgPahts(imgPaths);

return picUploadResult;

}

实现方法补充

// 项目上传至绝对路径(在yml里配置你的项目绝对路径)

@Value("${file.save-path}")

private String baseFilePath;

// 项目根路径下的目录 -- SpringBoot static 目录相当于是根路径下(SpringBoot 默认)

private final static String UPLOAD_PATH_PREFIX = "statics/uploadFile/";

控制层

public class FileUploadController {

// 允许上传的格式 图片形式

private static final String[] IMAGE_TYPE = new String[]{".bmp", ".jpg", ".jpeg", ".png"};

@Resource

private FileUploadService fileUploadService;

@PostMapping("/uploadImg")

public R uploadImg(@RequestParam("file") MultipartFile file, HttpServletRequest request) {

boolean isFlag = false;

for (String type : IMAGE_TYPE) {

System.out.println(file.getOriginalFilename());

if (StringUtils.endsWithIgnoreCase(file.getOriginalFilename(), type)) {

isFlag = true;

break;

}

}

if (isFlag) {

PicUploadResult picUploadResult = fileUploadService.uplodadImg(file, request);

boolean isLegal = picUploadResult.isLegal();

if (isLegal) {

Map resMap = new HashMap<>();

resMap.put("imgPath", picUploadResult.getImgPath());

return R.ok(resMap);

} else {

return R.error("图片上传有误");

}

} else {

return R.error("上传的图片格式必须为:bmp,jpg,jpeg,png");

}

}

@PostMapping("/uploadManyImg")

public R uploadManyImg(@RequestParam("files") MultipartFile[] files, HttpServletRequest request) {

boolean isFlag = false;

for (MultipartFile uploadFile : files) {

for (String type : IMAGE_TYPE) {

if (StringUtils.endsWithIgnoreCase(uploadFile.getOriginalFilename(), type)) {

isFlag = true;

break;

}

}

}

if (isFlag) {

PicUploadResult picUploadResult = fileUploadService.uploadManyImg(files, request);

boolean isLegal = picUploadResult.isLegal();

if (isLegal) {

Map resMap = new HashMap<>();

resMap.put("imgPaths", picUploadResult.getImgPahts());

return R.ok(resMap);

} else {

return R.error("图片上传有误");

}

} else {

return R.error("上传的图片格式必须为:bmp,jpg,jpeg,png");

}

}

}

工具类

根据实际情况添加所需的字段

public class PicUploadResult

{

private boolean isLegal;

private String imgPath;

private List imgPahts;

}

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

java动态上传图片_Java实现图片文件上传 的相关文章

  • STM32控制脉搏血氧心率MAX30102模块程序(I2C)

    一 简介 MAX30102是一个集成的脉搏血氧仪和心率监测仪生物传感器的模块 芯片 它集成了一个660nm红光LED 880nm红外光LED 光电检测器 光器件 以及带环境光抑制的低噪声电子电路 可通过软件关断模块 待机电流为零 实现电源始
  • 《海龟投资法则》读书笔记

    本文用于辅助阅读 海龟投资法则 市场 价格形态的类型 核心思想就是把价格波动抽成了波动性和趋势性 怎么让人联想到了光的波粒二象性 根据是否带有波动性和趋势性 可以分成四类价格形态 分别是 平稳 0 0 横向波动 0 1 平稳趋势 1 0 波
  • vue中swiper vue-awesome-swiper的使用方法和爬坑大法

    文章目录 由版本引起的一系列坑 正确的使用姿势 安装 指定版本 组件中使用 总结 由版本引起的一系列坑 时间 2020 07 08 时间 版本很重要 坑的起源 这两天在vue中使用swiper做轮播图 就随手百度了一下 找个帖子开始参考 坑
  • 从原理上理解JDBC的七个步骤,不再死记硬背

    由于平时经常使用持久层框架 早已把最初的JDBC忘到脑后去了 但是JDBC是一切持久层框架的根本 如果想要深入理解框架 就必须要掌握JDBC 最初学JDBC的时候只知道死记硬背那7个步骤 却从来没有理解那些步骤的由来 首先我们要理解JDBC
  • Windwos10最新版开启卓越性能

    老版本开启卓越性能的方法不管用了 1 首先右击开始菜单 打开power shell 管理员 将下面代码复制粘贴进去按回车 powercfg duplicatescheme e9a42b02 d5df 448d aa00 03f14749eb
  • 【多模态】UNIMO

    一 unimo 1 优点 训练数据包含文本 图像 图文对数据训练 不局限于图文对 2 策略和模型 1 文本改写 Text Rewriting 为了增强图文在多个粒度上的语义对齐能力 论文将图像的文本描述从句子级 短语级和词汇级别三个粒度进行
  • 【PCIE体系结构十】链路两端的参考时钟有频偏怎么办?

    个人主页 highman110 作者简介 一名硬件工程师 持续学习 不断记录 保持思考 输出干货内容 参考书籍 PCI EXPRESS系统体系结构标准教材 Mindshare PCIE规范中有描述PCIE支持公共参考时钟架构和独立参考时钟架
  • 合并排序

    与很多有用的算法类似 合并排序基于这样一个技巧 将 2 个大小为 N 2 的已排序序列合并为一个 N 元素已排序序列仅需要 N 次操作 这个方法叫做合并 我们用个简单的例子来看看这是什么意思 通过此图你可以看到 在 2 个 4元素序列里你只
  • STM32定时器——编码器模式采集EC11旋转编码器

    目录 一 EC11旋转编码器介绍 二 定时器编码器模式介绍 三 编码器初始化代码介绍 四 旋转EC11向串口发送数据 一 EC11旋转编码器介绍 EC11旋转编码器广泛用于车载DVD 车载导航 汽车影音上 常被人称为车载编码器 编码器主要用
  • Vue2中使用自定义指令

    在vue中 除了vue提供了一套内置的指令外 Vue 也允许注册自定义指令 用来配置重写某一项数据的方法 声明自定义指令 分为全局注册自定义指令 以及局部注册自定义指令 全局注册 为 Vue directive 接收两个参数 第一个参数为字
  • HADOOP调优与运维问题汇总

    一 Hadoop调优 1 调整操作系统打开文件描述符的上限 通过命令 ulimit a 可以看到所有系统资源参数 这里面需要重点设置的是 open files 和 max user processes 其它可以酌情设置 要永久设置资源参数
  • python 中 np.sum()函数 通俗易懂理解!

    查看我的另一篇博客更清晰 https blog csdn net goodshot article details 79709884 这一篇博客保证是我写的最清楚 最容易理解的博客 众所周知 sum不传参的时候 是所有元素的总和 这里就不说
  • AJAX的使用方式及教程

    1 概念 ASynchronous JavaScript And XML 异步的JavaScript 和 XML 1 异步和同步 客户端和服务器端相互通信的基础上 客户端必须等待服务器端的响应 在等待的期间客户端不能做其他操作 客户端不需要
  • 数据挖掘一些面试题总结(Data Mining)

    Data Mining试题 2011Alibaba数据分析师 实习 试题解析 一 异常值是指什么 请列举1种识别连续型变量异常值的方法 异常值 Outlier 是指样本中的个别值 其数值明显偏离所属样本的其余观测值 在数理统计里一般是指一组
  • Fastjson

    1 介绍 Fastjson是阿里巴巴的开源JSON解析库 它可以解析JSON格式的字符串 支持将Java Bean序列化为JSON字符串 也可以从JSON字符串反序列化到JavaBean 具有执行效率高的特点 应用范围广泛 Fastjson
  • (基础)选择器的语法

    1 什么是选择器 CSS选择器是CSS规则的第一部分 每个CSS规则都以一个选择器或一组选择器为开始 CSS 选择器即用于 查找 或选取 要设置样式的 HTML 元素的模式 选择器可以分为基础选择器 复合选择器 2 基本选择器 1 通配 通
  • SpringBoot应用程序的打包和部署 [学习笔记]

    传统Web应用打包部署时 通常会用War包的形式 然后将War包部署到Tomcat等服务器中 而Spring Boot应用是嵌入式Servlet容器 默认以Jar包形式进行打包部署的 而如果想要使用传统的War包形式打包部署 需要进行配置
  • WebKit中RefPtr和PassRefPtr的使用

    历史 WebKit中的许多对象是引用计数的 reference counted 采用的模式就是类具有ref和deref成员函数增加和减少引用计数 每个ref调用必须有一个deref与之匹配 当在引用计数值为1的对象上调用deref方法时 对
  • OSX 中为php安装 apc 扩展

    php中安装apc扩展 AndyMacBookPro log andy pecl install apc downloading APC 3 1 13 tgz Starting to download APC 3 1 13 tgz 171

随机推荐

  • Linux-docker下载docker-compose很慢、太慢、中断解决办法

    出现下一部分就断开的问题时 直接去github上下载后 传到虚机上 改个名字就可以 下载地址 https github com docker compose releases tag v2 2 2 2 2 2是对应版本 可修改 一般都是红框
  • RPA Uipath学习心得

    由于工作中存在大量繁琐的流程化事项 因此采用傻瓜机器人Uipath在后台处理 使得有更多时间去做创造性的工作 1 官网下载安装及教程 https www uipath com 2 基本操作步骤 首先是创建程序 然后调试运行 检查发布即可 3
  • MySQL全连接查询

    mysql没有全连接 但我们可以通过以下两种方式实现 1 使用union和left join实现全连接 select xxx 查询字段 from table1 left join table2 on xxx 连接条件 下同 where xx
  • LinuxMint上硬盘重装LinuxMint(理论上ubuntu也行)

    主要思路是通过修改引导程序 grub2 的配置文件 boot grub grub cfg 使计算机开机后引导硬盘中存放的系统镜像文件 iso 步骤 1 将下载好的系统镜像文件放入硬盘中一个不会被格式化的分区中 为了方便我直接放在了sda1的
  • C语言可以开发哪些项目?

    C语言是我们大多数人的编程入门语言 对其也再熟悉不过了 不过很多初学者在学习的过程中难免会出现迷茫 比如 不知道C语言可以开发哪些项目 可以应用在哪些实际的开发中 这些迷茫也导致了我们在学习的过程中不知道如何学 学什么 所以 总结这个列表
  • treeSelect节点搜索

    antd中treeSelect的filterTreeNode用法 节点搜索 以下图为例 树形搜索展开后 有以下几个选项 如果我想要搜索其中 产品中心 那直接搜索关键词 产品 即可 我搜索后并未显示我想要的结果 而是为空 这就需要用到 fil
  • 总结JS 常用函数

    希望本文总结的内容能给各位看官带来焕然一新的感觉 另外 如果你们有什么值得推荐的js技巧 欢迎在评论中补充 我可以收纳在本文中 PS 此文档会持续新增内容 Ajax请求 jquery ajax函数 我自己封装了一个ajax的函数 代码如下
  • sudo 之后 unable to resolve host的问题解决办法

    gedit etc hosts 127 0 0 1 localhost 127 0 0 1 Masterback或者其他 把后面的Masterback 或者其他改成新的主机名 应该是最近修改过主机名 也就是用户名 后面的部分
  • _WIN32和_WIN64区别

    WIN32 是一个预定义的宏 用于判断当前编译环境是否为 Windows 操作系统 当使用 MSVC 编译器编译 Windows 应用程序时 无论是 32 位还是 64 位的 Windows 环境 WIN32 宏都会被定义 你可以使用条件编
  • 蓝桥杯2021年第十二届国赛真题-和与乘积

    题目描述 给定一个数列 A a1 a2 an 问有多少个区间 L R 满足区间内元素的乘积等于他们的和 即 aL aL 1 aR aL aL 1 aR 输入格式 输入第一行包含一个整数 n 表示数列的长度 第二行包含 n 个整数 依次表示数
  • SetTimer在无窗口和有窗口线程的使用 .

    今天犯了一个粗心的错误 在无窗口线程中 SetTimer中设置计时器ID 而WM TIMER消息响应函数中得到的计时器ID却不是之前设置的计时器ID 111902 cpp Defines the entry point for the co
  • Prepo —— 图标转化器

    Prepo for mac是Mac os平台上的一款非常不错的Mac图像处理软件 Prepo for mac基于Mac和iOS的一款免费且方便的图标转化器 它可以帮助设计师快速的导出各种尺寸的图标 设计师通过Prepo把任何格式的图片文件转
  • img引入的svg图片,悬浮时怎么修改颜色?

    实现效果 鼠标悬浮在这一行 让这行的文字和svg图片颜色发生变化 因为是用 img标签引入页面 使用fill属性是无效的 css核心代码 active hover transform scale 0 98 img filter drop s
  • Transaction silently rolled back because it has been marked as rollback-only Spring事务嵌套问题

    Transaction silently rolled back because it has been marked as rollback only Spring 事务嵌套问题 添加命令 catch中添加 TransactionAspe
  • Springboot升级到2.x后gridFsTemplate.findOne(query)返回类型由GridFSDBFile改为GridFSFile导致的问题

    问题描述 gridFsTemplate findOne query 返回类型由GridFSDBFile改为GridFSFile导致的问题 文件下载时下面的代码不可用 GridFSDBFile gridFSDBFile new GridFSD
  • java.lang.NoClassDefFoundError: javax/servlet/ServletContext(可能报错原因,不可盖全)

    例如一下jar包版本低 提高版本即可 version 5 0 5RELEASE
  • ArcGIS中统计渔网中栅格人口密度

    文章目录 前言 一 人口数据获取 来源一 中科院地理所公开数据集 来源二 WorldPop数据集 二 人口格网统计步骤 1 创建渔网 2 人口数据处理 2 1 栅格转点 2 2 空间插值 处理人口缺失数据 2 3 空间连接 渔网人口统计 总
  • IGBT简介、结构及原理

    所谓IGBT 绝缘栅双极型晶体管 是由 BJT 双极结型晶体三极管 和 MOS 绝缘栅型场效应管 组成的复合全控型 电压驱动式 功率半导体器件 其具有自关断的特征 简单讲 是一个非通即断的开关 IGBT没有放大电压的功能 导通时可以看做导线
  • ubuntu 安装微信(wechat)

    软件介绍 Wine Wine Is Not an Emulator Wine不是一个模拟器 的缩写 是一个能够在多种 POSIX compliant 操作系统 诸如 Linux Mac OSX 及 BSD 等 上运行 Windows 应用的
  • java动态上传图片_Java实现图片文件上传

    Java实现后台图片上传 将上传图片的接口进行分层 便于维护接口 接口部分 interface 将接口分为单图片上传以及多图片上传 public interface FileUploadService 单图片上传 PicUploadResu