写在前面
本例子是从前台拿到图片和其他信息之后把图片用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;
}
}
前台代码
<input type="file" id="test-image-file" name="imgFile" accept="image/gif, image/jpeg, image/png, image/jpg">