图片的上传以及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. CentOS 下安装编译安装MeMcached
  2. .net随笔-vb.net 剪粘板(1)
  3. 自己在UWP程序上调用usb转串口的路程
  4. Ruby file操作cheatsheet
  5. 2.3 logistic 回归损失函数
  6. oe_runmake failed
  7. Android下最简单的Audio Player
  8. 第十一届河南省程序设计大赛----部分题解
  9. 黑链-最高明的网站隐藏链接方法
  10. 矿井下无线基站和地面服务器,煤矿井下无线通信系统_矿井通信
  11. 评职称自费出书多少钱
  12. CentOS7部署YApi
  13. idea 修改工作空间
  14. input输入框对伪类(after,before)支持情况
  15. Picgo 水印制作教程
  16. 每日一练-10-求矩阵主对角线及副对角线元素的和
  17. SpringBoot应用裁减使用Netty替换内置Web容器
  18. SuperData上线VR数据平台,做行业发展的“指明灯”
  19. 计算机关闭应用程序的快捷键,关闭电脑程序的快捷键是什么
  20. 【读书笔记】《牧羊少年奇幻之旅》

热门文章

  1. js 实现一个打点计时器
  2. Mysql查询性能优化-善用Explain语句
  3. C#中接口IFormattable/IFormatProvider/ICustomFormatter的区别与用法
  4. MFC程序阻止别的软件隐藏窗口,或拦截WM_SHOWWINDOW消息
  5. Dapr专题之06Actors
  6. 自行车电动自行车|GCC认证办理流程
  7. C# vb .net实现胶片效果滤镜
  8. [CityHunter]点击ListView项目后修改其内容
  9. win10找回永久删除文件【图文教程】
  10. Java+spring基于ssm的基于SSM的高校奖学金助学金管理系统