图片的上传以及Nginx的使用实现上传图片的回显

1.图片的上传:

图片上传使用的是easyUI的组件,并不是自己实现的.

实现图片上传的前提是配置了文件上传的解析器(applicationContext-mvc.xml):

<!-- 配置文件上传的解析器 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><property name="maxUploadSize" value="10485670"></property><property name="defaultEncoding" value="UTF-8"></property>  <!-- 解决文件是中文的问题 -->
</bean>

1.1 前端的代码:

kingEditorParams : {filePostName  : "uploadFile",uploadJson : '/pic/upload',dir : "image"
},

这是前端common.js实现的封装的代码,当一点击开始上传的时候,就是访问的这个路径,会把图片发送给服务端(下面这张图是使用了Nginx反向代理之后实现的图片回显的效果)

当一点击开始上传之后,会把图片通过post请求发送给服务端,处理请求的路径是/pic/upload,文件上传的名字是uploadFile

1.2 服务端的实现:

FileController:具体的业务放在service层

@Controller
public class FileController {@Autowiredprivate FileUploadService fileUploadService;@RequestMapping("/pic/upload")@ResponseBodypublic PicUploadResult uploadPic(MultipartFile uploadFile) {return fileUploadService.uploadPic(uploadFile);}
}

controller层接受请求的参数名字是uploadFile(这个是固定的,前端传过来的),参数的类型是MultipartFile,MultipartFile是一个接口,具体的类型是org.springframework.web.multipart.commons.CommonsMultipartFile,配置的文件上传解析器会将客户端传过来的文件解析成CommonsMultipartFile.

FileUploadService:

@Service

public class FileUploadServiceImpl implements FileUploadService {

/*** Spring容器如何动态的获取数据* @Value : 实现数据的动态获取* 说明:@value 注解可以直接为String或者基本类型赋值*     同时,可以利用spring的机制可以为array , list , mapp , set properties 赋值* * 注意事项:*  1.在SSM框架中,该注解需要依赖@Service注解(Spring容器内部才能使用)  在Controller注解可能不好使*      SpringMVC容器  跟 Spring容器  是两个不同的容器*  2.如果使用SpringBoot则任何地方都能用*/
@Value("${image.localDir}")
private String localDir;
@Value("${image.urlPre}")
private String urlPre;@Override
public PicUploadResult uploadPic(MultipartFile uploadFile) { // 图片上传PicUploadResult result = new PicUploadResult();// 1.判断是否为图片 abc.jpgString fileName = uploadFile.getOriginalFilename();// 使用正则表达式进行判断if (!fileName.matches("^.*(jpg|png|gif)$")) { // . 代表任意的字符 * 代表有任意多个 的// 表示不是图片result.setError(1);return result;}try {/*** ImageIO是javax下面的一个工具类*/// 2.判断是否为恶意程序 uploadFile.getInputStream() 文件流BufferedImage bufferedImage = ImageIO.read(uploadFile.getInputStream());// 3.获取图片宽度和高度 (图片宽高为 0 ,则图片是假的图片)int height = bufferedImage.getHeight();int width = bufferedImage.getWidth();if (height == 0 || width == 0) {result.setError(1); // 假图片return result;}// 4.准备文件存储的路径()// String localDir = "d:/file/"; // 本地文件夹// 5.实现分文件存储 yyyy/MM/dd 以 天 为单位 分文件String dateDir = new SimpleDateFormat("yyyy/MM/dd").format(new Date());// 6.形成保存图片的文件夹 d:/file/yyyy/MM/dd (文件存储的根目录)String picDir = localDir + dateDir;// 7.生成文件夹File picFile = new File(picDir); // 文件夹的文件执行if (!picFile.exists()) { // 文件夹不存在 就创建文件夹picFile.mkdirs();}// 8.重命名上传的文件名字 (避免重名)String uuid = UUID.randomUUID().toString().replace("-", ""); // asa22exac-adsfafadsf-3fddsfds// 生成随机数int randomNum = new Random().nextInt(999); // 生成随机数 (0-999)// 获取文件的后缀名String fileType = fileName.substring(fileName.lastIndexOf(".")); // .jpg// 拼文件名String realFileName = uuid + randomNum + fileType; // 真实的文件名称// 9生成文件的本地磁盘的路径 d:/file/yyyy/MM/dd/wqrwadasfiuoew800.jpgString localPath = picDir + "/" + realFileName;// 10实现文件的上传uploadFile.transferTo(new File(localPath));// 11添加文件的宽度,高度 需要返回result.setHeight(height + "");result.setWidth(width + "");// 12准备文件的虚拟路径// http://image.jt.com/file/2018/05/07/radweedwsaf210.jpg// String urlPre = "http://image.jt.com/";String urlPath = urlPre + dateDir + "/" + realFileName;result.setUrl(urlPath);} catch (IOException e) { // 不是图片会抛异常e.printStackTrace();result.setError(1); // 表示为恶意程序return result;}return result;}
}

分析:客户端上传文件,需要先判断上传的文件是不是图片,先使用正则表达式进行第一层过滤,如果正则的验证过了之后,但是可能是伪图片,所以还得使用ImageIO来将上传的文件进行转换成BufferedImage,如果转换失败,那么可能不是图片,转换成功之后,还得获取图片的宽,高,如果宽高任何一个为0,就说明转换之后不是图片,也就说明上传的不是图片.


如果这些验证都过了,说明上传的文件是图片,那么我们就需要将图片保存起来.由于上传的图片名字是固定的,而且保存的时候如果使用原始的图片名字的话,很可能
会出现名字冲突的问题,为了尽可能地避免重现保存图片出现冲突的问题,就需要服务端生产随机的名字,这里采用一种更安全的做法,先使用UUID生成一串随机数,
但是这种方式生成的随机数是根据时间戳来生成的(同一毫秒值生成的uuid随机数可能会一样),所以还得使用Randoom再生成随机的数字,将uuid生成的随机串
(去掉'-')加上生成的随机数字组成图片的名字,这种情况出现重名的概率比较小

注意拿到了图片文件之后,还需要将图片文件保存,所有的图片都保存在一个大的文件夹下(d:/file),但是这个文件夹路径是不能写死的,得用配置文件进行配置,还有
一点就是图片的回显需要一个虚拟的路径.图片上传之后,

图片的上传之后的回显是由easyUI来实现的,但是要求是从服务端返回个数据的页面的json数据是有要求的,

{"error":0,"url":"图片的保存路径","width":图片的宽度,"height":图片的高度}

参数说明: 0代表是一张图片,如果是0,前台才可以解析并显示。1代表不是图片,
不显示如果不设置宽度和高度,则默认用图片原来的大小,所以不用设置

返回的就是 PicUploadResult

public class PicUploadResult {private Integer error=0;        //图片上传错误不能抛出,抛出就无法进行jsp页面回调,所以设置这个标识,0表示无异常,1代表异常private String url;private String width;private String height;
~~~ 此处省略get,set方法

这个返回的对象里面的url需要在服务端进行封装,封装的就是easyUI实现回显图片的虚拟路径,这个url是虚拟路径:

理解这个url(虚拟路径) : 图片有专门的图片服务器,图片的存储也是在专门的服务器里面,异常easyUI要进行图片的回显,就需要访问图片服务器.目前我们这个
项目保存图片是保存在d:file里面,目前的水平只能做到保存在本机(还做不到保存在别的服务器),但是做图片回显的时候,我们就希望模拟实现那种跨服务器的
图片访问(现在用的是同一台主机),所以返回的url是一个虚拟路径,http://image.jt.com/.这就相当于当图片回显时,访问的是这个域名下的图片.

为了实现程序的可扩展性,可以把两个变量写在配置文件里面,一个是localDir(图片保存的本地根目录),还有一个是urlPre(图片回显时需要访问的网址)

有了这个properties配置文件之后,好需要加载这个配置文件(在applicationContext里面进行加载)

    <bean id="placeholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><!-- 设定参数  Resource[] locations  数组类型 --><property name="locations"><!-- 可以加多个 --><list><value>classpath:/properties/jdbc.properties</value><value>classpath:/properties/image.properties</value></list>  <!-- 或者array --></property></bean>

这样在service层就可以直接使用@Value()注解进行动态地赋值注入了

如何实现图片的上传-(上传到本地)相关推荐

  1. axios获取图片显示_Vue.js+axios图片预览以及上传显示进度

    在平时项目开发中,我们经常会对文件做一些上传操作,不仅仅要实现基本需求,也要兼顾用户体验,根据自己在工作中遇到的问题谈谈对图片上传的预览以及上传进度的优化. 1.搭建项目 基于Vue.js+axios ...

  2. 解决:百度编辑器UEditor,怎么将图片保存到图片服务器,或者上传到ftp服务器的问题(如果你正在用UE,这篇文章值得你看下)

    解决:百度编辑器UEditor,怎么将图片保存到图片服务器,或者上传到ftp服务器的问题(如果你正在用UE,这篇文章值得你看下) 参考文章: (1)解决:百度编辑器UEditor,怎么将图片保存到图片 ...

  3. 【Android实战】----基于Retrofit实现多图片/文件、图文上传

    本文代码详见:https://github.com/honghailiang/RetrofitUpLoadImage 一.再次膜拜下Retrofit Retrofit无论从性能还是使用方便性上都很屌! ...

  4. 图片文件压缩并上传至阿里云OSS

    图片处理 Thumbnails 在进行Java开发时可以使用Thumbnails工具类对图片进行处理,旋转.裁剪.格式转换.加水印等. 使用步骤 导包 <dependency><gr ...

  5. 使用饿了么update组件 实现多文件上传到后台以及本地图片显示功能

    使用饿了么update组件 实现多文件上传到后台以及本地图片显示功能 查了很多博客,终于弄出来了.我就大概说一下.我的业务内容是要把一个表单统一上传上去,而且其中有字段也有图片. <div cl ...

  6. 解决CSDN导入md文档时图片显示不出来,出现[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jiakLQhy-1628602853830)提示

    解决CSDN导入md文档时图片显示不出来,出现[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jiakLQhy-1628602853830)提示 https://blog ...

  7. Delphi FMX正确设计和加载图片满足分布式跨平台App的性能需求-分布式跨平台App中美工图片的处理、上传下载、并发及客户端显示技术架构

    Delphi FMX正确设计和加载图片满足分布式跨平台App的性能需求 分布式跨平台App中美工图片的处理.上传下载.并发及客户端显示技术架构 [综合:客户端(内存耗用.设备屏幕的自动适配).服务端( ...

  8. 图片太大不能上传怎么办?

    图片太大不能上传怎么办?不管你是上班族还是学生,这几乎是每个人都遇到过的问题,很多网站为了防止自己的服务器存储空间不那么快被占用完,都会对上传的图片大小进行限制,操作大小限制的图片是不能被上传成功的. ...

  9. H5图片预览及上传(WEB前端)

    H5图片预览及上传 web上传图片很简单,网上有许多的demo和js,但是本人嫌弃用那些会引入许多js包,所以还是用原生的jquery来写吧. 一.html布局文件 html有一个自己的上传文件控件- ...

  10. 图片服务器上图片的管理网站上传与前台显示

    图片服务器上图片的管理网站上传与前台显示 代码简介:  很实用的一个图片上传得例子 图片上传:生成缩略图 加文字水印 图片水印 51aspx.png为水印图片 远程图片抓取(保存到本地)支持jpg.g ...

最新文章

  1. 网站真分页js代码该怎么写?
  2. matlab bs2rv.m,Matlab智能算法之遗传算法(一)
  3. C++ 暂停Windows文件保护
  4. adodb.stream文件操作类
  5. OpenCASCADE绘制测试线束:OCAF 命令之标准演示命令
  6. Visual Studio Team System 2008 Team Suite (90-day Trial)(转)
  7. hbuilderx的快捷键整理pdf_mac键盘快捷键详解,苹果电脑键盘快捷键图文教程
  8. 能量谱与功率谱(转自百度文库与维基百科)
  9. grunt安装与运行
  10. php统计在一个页面停留时间,php记录页面停留时间的代码
  11. 电脑公司特别版常用软件盘
  12. c语言 字符串比较 指定长度,strncmp函数——比较特定长度的字符串详解
  13. 2022-2027年中国电动汽车充电站行业发展监测及投资战略研究报告
  14. linux系统在当前目录下创建子目录,linux根目录下一级子目录
  15. java游戏征途2008_醉剑逍遥-征途天下
  16. 测测你的IQ加分析能力
  17. 笔记:STM32的ADC参考电压与参照电压(电源监测)
  18. matlab求二阶微分方程的通解,二阶常微分方程matlab的数值解和解析解分析总报告.ppt...
  19. Word里的图片显示不全,只显示最下面的一小部分的解决办法
  20. 【读书笔记】描述个人优势的34个主题--《现在,发现你的优势》

热门文章

  1. 沈颖刚:生物柴油或是高原柴油货车污染治理有效途径
  2. 打点计时器的实现javascript
  3. mysql初始化密码_MySQL5.7初始密码查看及重置
  4. python学习笔记 Counter()
  5. 点赋科技:网店的营销策略是什么?
  6. ABOUTCG发布Maya 刚体特效完全教程
  7. Usability Engineering
  8. 【笔记总结】高中生物——【选一 Ⅰ】传统发酵技术的应用
  9. tf 矩阵行和列交换_tf矩阵基础
  10. 假币问题详解(枚举的经典例题)