我所想要的图片上传接口是指服务器端在完成图片上传后,返回一个可访问的图片地址

spring mvc框架下图片上传非常简单,如下 

 @RequestMapping(value="/uploadImg", method=RequestMethod.POST)
 @ResponseBody
 public String uploadImg(@RequestParam(value="img")MultipartFile img){
     File f = new File("/data/images");
     try{
         FileUtils.copyInputStreamToFile(img.getInputStream(), f);
     }catch(Exception e){
         e.printStackTrace();
     }
     return "上传成功";
 }

非常简单吧!

 <form action="http://localhost/component/common/uploadImg" method="post" enctype="multipart/form-data">
     头像:<input type="file" name="img" /><br/>
     <input type="image" src="./images/img_submit.gif" />
 </form>

以上仅仅只是能够上传文件而已,而我们还要能返回一个图片地址,这个图片地址要能在浏览器中直接访问,如下:

直接代码吧!

controller层

 @RequestMapping(value="/uploadImg", method=RequestMethod.POST)
 @ResponseBody
 public String uploadImg(@RequestParam(value="img")MultipartFile img, HttpServletResponse response){
     JSONObject result = new JSONObject();
     boolean flag = true;
     try {
         flag = pictureUploadService.upload(img, result);
     } catch (Exception e) {
         result.put("mess", "调用失败");
         flag = false;
         e.printStackTrace();
     }
     result.put("flag", flag);

     response.setContentType("text/html;charset=UTF-8");
     //解决跨域名访问问题
     response.setHeader("Access-Control-Allow-Origin", "*");

     return result.toString();
 }

service层

 /**
  * 上传图片
  * @param file
  * @param params
  * @return
  * @throws Exception
  */
 public boolean upload(MultipartFile file, JSONObject params) throws Exception{
     //过滤合法的文件类型
     String fileName = file.getOriginalFilename();
     String suffix = fileName.substring(fileName.lastIndexOf(".")+1);
     String allowSuffixs = "gif,jpg,jpeg,bmp,png,ico";
     if(allowSuffixs.indexOf(suffix) == -1){
         params.put("resultStr", "not support the file type!");
         return false;
     }

     //获取网络地址、本地地址头部
     Properties config = new Properties();
     config.load(this.getClass().getClassLoader().getResourceAsStream("config.properties"));
     String urlPath = config.getProperty("urlRoot");
     String localPath = config.getProperty("localRoot");

     //创建新目录
     String uri = File.separator + DateUtil.getNowDateStr(File.separator);
     File dir = new File(localPath + uri);
     if(!dir.exists()){
         dir.mkdirs();
     }

     //创建新文件
     String newFileName = StringUtil.getUniqueFileName();
     File f = new File(dir.getPath() + File.separator + newFileName + "." + suffix);

     //将输入流中的数据复制到新文件
     FileUtils.copyInputStreamToFile(file.getInputStream(), f);

     //创建Picture对象
     Picture pic = new Picture();
     pic.setLocalPath(f.getAbsolutePath());
     pic.setName(f.getName());
     pic.setUrl(urlPath + uri.replace("\\", "/") + "/" + newFileName + "." + suffix);
     pic.setAddTime(new Date());

     //插入到数据库
     //...

     params.put("resultStr", pic.getUrl());

     return true;
 }

(暂时没有dao层,我在properties中配置网络地址的域名以及本地文件存储目录)

上传文件有几个地方需要注意:

  • 上传文件的中文乱码(这个暂不考虑,毕竟要实现的是图片上传)
  • 限制上传文件大小(文件过大,会导致服务器不堪重负),这个我们在spring mvc的配置文件中进行限制
     <beans:bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
         <beans:property name="defaultEncoding" value="utf-8" />
         <beans:property name="maxUploadSize" value="10485760000" />
         <beans:property name="maxInMemorySize" value="40960" />
     </beans:bean>
  • 限制上传文件类型(这个我们在service层进行处理)
  • 如果一个文件夹下面保存超过1000个文件,就会影响文件访问性能,所以上传的文件要分散存储(这个分散策略有多种,不必拘泥于一种。我这里偷懒用了年月日作为目录层级
     /**
      * 获取当前日期字符串
      * @param separator
      * @return
      */
     public static String getNowDateStr(String separator){
         Calendar now = Calendar.getInstance();
         int year = now.get(Calendar.YEAR);
         int month = now.get(Calendar.MONTH)+1;
         int day = now.get(Calendar.DATE);
    
         return year + separator + month + separator + day;
     }
  • 上传成功后保存的文件不能重名(即文件名要唯一)
     //生成唯一的文件名
     public static String getUniqueFileName(){
         String str = UUID.randomUUID().toString();
         return str.replace("-", "");
     }

上传图片流程如下:

点击上传后,返回

在浏览器中输入上面的这个图片地址访问,然后出现

springMVC框架下——通用接口之图片上传接口的更多相关文章

  1. Asp.NetCoreWebApi图片上传接口(二)集成IdentityServer4授权访问(附源码)

    写在前面 本文地址:http://www.cnblogs.com/yilezhu/p/9315644.html 作者:yilezhu 上一篇关于Asp.Net Core Web Api图片上传的文章使 ...

  2. springmvc上传图片并显示--支持多图片上传

    实现上传图片功能在Springmvc中很好实现.现在我将会展现完整例子. 开始需要在pom.xml加入几个jar,分别是: <dependency> <groupId>comm ...

  3. 用海豚框架(DolphinPHP)实现单/多图片上传时,如何获得图片路径

    用框架实现图片上传很简单,就不多说了,然后这个框架的实现机制是这样的,我们选择图片,点击上传,他会将图片保存在uploads下,以当天时间和随机字母作为图片名,然后在返回个数字,这个数字是这个图片的i ...

  4. SpringMVC框架(四)文件的上传下载,上下文路径

    文件目录: SpringMVC配置文件: <?xml version="1.0" encoding="UTF-8"?> <beans xmln ...

  5. vue下实现input实现图片上传,压缩,拼接以及旋转

    背景 作为一名前端工作人员,相信大家在开发系统的时候,经常有遇到需要这么一种需求,就是需要为用户保存上传的图片,很多小白遇到这个问题的时候,都会虎躯一震,以为会是一个棘手的问题,当你读完这篇文章的时候 ...

  6. layedit图片上传接口案列

    html部分 <divclass="layui-form-item"> <labelfor="tname"class="layui- ...

  7. thinkphp5图片上传接口

    public function avatarUpload() { $file = request()->file('file'); $filePath = 'avatar'; $width = ...

  8. 简单总结下关于blob的图片上传

    我是从一本书上看到了Azure Blob,然后在网上浪了一会儿,发现了这篇文章,里面他已经把重点的则重地方讲完了,"飞机票:http://www.cnblogs.com/sparkdev/p ...

  9. 【原创】.Net 微信 JS-SDK图片、语音上传接口的实现(MVC)-(一 、上传图片)

    前段时间在做一个微信的项目,遇到了一个上传图片的问题,花了一下午,解决了这个问题,然后把总结出来的代码,分享了出来. 最近又有一个图片+语音的功能, 更是蛋疼, 本次采用的不是File文件上传,然后转 ...

随机推荐

  1. 矩阵乘法 codevs 1287 矩阵乘法

    1287 矩阵乘法  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold       题目描述 Description 小明最近在为线性代数而头疼,线性代数确实很抽象 ...

  2. action间传多个参数时注意问题

    通常我们action之间传参可以有多种形式,举例说明:示例1: <result name="test" type="redirect-action"> ...

  3. [001] winnie the pooh - 读后记

    winnie the pooh 我是在伍君仪透析英语视频培训班,获得这本书的,PDF格式的(排版不是很好,和当当上的相比有部分章节缺失) 这是我第一本采用透析法读完的英文书. 今天(2015年10月2 ...

  4. centos 6 搭建ftp服务器支持匿名读写

    转载请注明: 凌云物网智科嵌入式实验室: http://iot-yun.com/     郭文学<guowenxue@gmail.com> vsftpd在运行时一定要关闭SELinux,否 ...

  5. poj1484---判断保险丝是否烧断

    题目输入要求: 2 2 10 //设备数n  接下来的操作数m   保险丝能承受最大电流c5 //电器1的电流7 //2的电流1 //反转开关12 //反转开关2 思路:设置一个flag数组,记得每次 ...

  6. PL/SQL个人学习笔记(二)

    IF条件 declare cursor s is            select version from city_server t;   s_ city_server.version%type ...

  7. 多线程编程学习笔记——async和await(一)

    接上文 多线程编程学习笔记——任务并行库(一) 接上文 多线程编程学习笔记——任务并行库(二) 接上文 多线程编程学习笔记——任务并行库(三) 接上文 多线程编程学习笔记——任务并行库(四) 通过前面 ...

  8. mosquitto安装和测试

    一.安装 1.windows安装 安装完毕,更新安装目录的dll文件 2.linux安装 编译保存用户数据到数据库的插件 安装 3.启动 mosquitto mosquitto mosquitto_p ...

  9. [Tensorflow] RNN - 02. Movie Review Sentiment Prediction with LSTM

    From: Predicting Movie Review Sentiment with TensorFlow and TensorBoard Ref: http://www.cnblogs.com/ ...

  10. CF 258 D. Little Elephant and Broken Sorting

    D. Little Elephant and Broken Sorting 链接 题意: 长度为n的序列,m次操作,每次交换两个位置,每次操作的概率为$\frac{1}{2}$,求m此操作后逆序对的期 ...