Controller上传图片,数据库存路径(解决了每次重启项目图片丢失问题)(JAVA)

写在前面

本例子是从前台拿到图片和其他信息之后把图片用java通过流的方式存到项目的某个目录下,然后把路径存到数据库里,如果用base64的形式来存图片的话数据量比较大,不好读取。故采用这种方法。

代码

代码解析:

1. AjaxResult 是一个与ajax对接的实体类,Region 是要存到数据库的实体类
2. String  path = ClassUtils.getDefaultClassLoader().getResource("").getPath();这一句代码是获取到了target目录的根目录,而我们的图片如果只存到target目录下,那么每次重启项目更新资源的时候我们之前存的图片就会被删除掉,所以需要我们自己来安排存储路径。
3. path = path.split("/target")[0];//分割路径,拿到target前面的路径
        path = path.substring(1);//拿到的路径最前面会带一个/,去掉它
        path = path+"/src/main/resources/static/images/region";//后面拼接上我们想存的路径
4. 这里我存了两个地方,一个是存到项目的static下面,一个是存到target里面,如果不存到target里面,那么存完之后想要看的话只能重启项目,存两个地方的话我们只需要刷新一下页面就可以了
 @PostMapping("add")
    @ResponseBody
    public AjaxResult add(Region region,@RequestParam(value = "imgFile",required = false) MultipartFile multipartFile) throws IOException {

        //设置图片相关
        if(multipartFile != null){
            InputStream fileStream = multipartFile.getInputStream();
            //UUID生成一个随机号码,作为文件的名字
            String realFileName = UUID.randomUUID().toString()+"-img.jpg";
            //项目图片存放路径
            String  path = ClassUtils.getDefaultClassLoader().getResource("").getPath();
            //target路径
            String  path2 = ClassUtils.getDefaultClassLoader().getResource("").getPath()+"static/gameImg/";
            path2 = path2.substring(1);
            path = path.split("/target")[0];
            path = path.substring(1);
            path = path+"/src/main/resources/static/images/region";
            System.out.println(path);
            System.out.println(path2);
            File file = new File(path,realFileName);
            File file2 = new File(path2,realFileName);
            System.out.println(file.getAbsolutePath());
            System.out.println(file2.getAbsolutePath());
            if(!file.getParentFile().exists()) {
                file.getParentFile().mkdirs();
            }
            if(!file2.getParentFile().exists()) {
                file2.getParentFile().mkdirs();
            }
            OutputStream out = new FileOutputStream(file);
            OutputStream out2 = new FileOutputStream(file2);
            //创建字节缓存
            byte[] buffer = new byte[1024];
            int len = -1;
            //一次读取1kb(1024byte),返回-1表明读取完毕
            while((len = fileStream.read(buffer))!=-1) {
                //一次写入1kb(1024byte)
                out.write(buffer,0, len);
            }
            byte[] buffer2 = new byte[1024];
            int len2 = -1;
            //一次读取1kb(1024byte),返回-1表明读取完毕
            while((len2 = fileStream.read(buffer2))!=-1) {
                //一次写入1kb(1024byte)
                out2.write(buffer2,0, len2);
            }
            //冲刷流资源
            out.flush();
            //关闭流
            out.close();
            //冲刷流资源
            out2.flush();
            //关闭流
            out2.close();
            fileStream.close();
            region.setRegionImg("/images/region/"+realFileName);
        }
        return toAjax(regionService.save(region));
    }

AjaxResult类:

package com.mbyte.easy.common.web;

import java.util.HashMap;

public class AjaxResult extends HashMap<String, Object>
{
    private static final long serialVersionUID = 1L;

    /**
     * 初始化一个新创建的 Message 对象
     */
    public AjaxResult()
    {
    }

    /**
     * 返回错误消息
     * 
     * @return 错误消息
     */
    public static AjaxResult error()
    {
        return error(0, "操作失败");
    }

    /**
     * 返回错误消息
     * 
     * @param msg 内容
     * @return 错误消息
     */
    public static AjaxResult error(String msg)
    {
        return error(500, msg);
    }

    /**
     * 返回错误消息
     * 
     * @param code 错误码
     * @param msg 内容
     * @return 错误消息
     */
    public static AjaxResult error(int code, String msg)
    {
        AjaxResult json = new AjaxResult();
        json.put("code", code);
        json.put("msg", msg);
        return json;
    }

    /**
     * 返回成功消息
     *
     * @param object 内容
     * @return 成功消息
     */
    public static AjaxResult success(Object object)
    {
        AjaxResult json = new AjaxResult();
        json.put("data", object);
        json.put("code", 1);
        return json;
    }

    /**
     * 返回成功消息
     * 
     * @param msg 内容
     * @return 成功消息
     */
    public static AjaxResult success(String msg)
    {
        AjaxResult json = new AjaxResult();
        json.put("msg", msg);
        json.put("code", 1);
        return json;
    }
    
    /**
     * 返回成功消息
     * 
     * @return 成功消息
     */
    public static AjaxResult success()
    {
        return AjaxResult.success("操作成功");
    }

    /**
     * 返回成功消息
     * 
     * @param key 键值
     * @param value 内容
     * @return 成功消息
     */
    @Override
    public AjaxResult put(String key, Object value)
    {
        super.put(key, value);
        return this;
    }
}

前台代码


你可能感兴趣的:(#,后端)