- 前言:在用Java做一些小项目的时候,为了少许的图片上传做一个文件服务器不值得,所以最快最简便的方式就是直接保存到数据库中。
因为部署的时候前后台有可能会分开部署公用一个库,所以把文件存到数据库是最好的办法之一。 - 建表
CREATE TABLE `tbl_file` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `case_id` bigint(20) DEFAULT NULL, `case_clazz` varchar(255) DEFAULT NULL, `images` mediumblob COMMENT '图片', `size` double DEFAULT NULL COMMENT '大小', `srcName` varchar(255) DEFAULT NULL COMMENT '名称', `unit` varchar(255) DEFAULT NULL COMMENT '单位', `create_time` datetime DEFAULT NULL, `is_delete` char(1) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=45 DEFAULT CHARSET=utf8;
引入js(我这里用的是ajaxfileupload.js)
编码:
model、dao、mapper这里不再描述,用mybatis自行生成
service
@Override
public Long insertSelective(MultipartFile file) throws IOException {
File fileEO=new File();
String fileName = file.getOriginalFilename();
fileEO.setSrcname(fileName);
// 计算出文件的大小与现实单位(KB/MB)
long bytes = file.getSize();// bytes
String[] transferedArr = SXUnitUtils.byte2kbmb(bytes);
Double size = Double.valueOf(transferedArr[0]);
String unit = transferedArr[1];
fileEO.setSize(size);
fileEO.setUnit(unit);
//转换图片格式 :MultipartFile --> byte
byte[] images = file.getBytes();
fileEO.setImages(images);
fileEO.setCreateTime(new Date());
fileMapper.insertSelective(fileEO);
return fileEO.getId();
}
3. controller
package com.bob.analyst.admin.controller;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.UnsupportedEncodingException;
import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import com.bob.analyst.model.File;
import com.bob.analyst.service.FileService;
import com.bob.analyst.util.DeleteType;
@Controller
@RequestMapping(value = "/file")
public class FileController extends AjaxController {
@Resource
private FileService fileService;
@RequestMapping(value = "/upload")
@ResponseBody
public Long upload(@RequestParam(value = "file") MultipartFile file,
HttpServletRequest request) throws Exception {
try {
return fileService.insertSelective(file);
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
@RequestMapping("showImage/{id}")
@ResponseBody
public byte[] showImage(@PathVariable("id") Long id, HttpServletResponse response) throws Exception {
File fileEO=fileService.selectByPrimaryKey(id);
if(fileEO==null||fileEO.getIsDelete().endsWith(DeleteType.IS_DELETE)){
throw new IllegalAccessException();
}
byte[] images = fileEO.getImages();
String fileName =fileEO.getSrcname().toLowerCase();
if (fileName.lastIndexOf(".jpg") == -1 && fileName.lastIndexOf(".png") == -1
&& fileName.lastIndexOf(".jpeg") == -1 && fileName.lastIndexOf(".gif") == -1
&& fileName.lastIndexOf(".bmp") == -1) {
BufferedInputStream bis = null;
ServletOutputStream fos = null;
byte[] buf = new byte[1024];
int size = 0;
bis = new BufferedInputStream(new ByteArrayInputStream(images));
response.setContentType("multipart/form-data");
String realfilename = "";
try {
//防止乱码
realfilename = new String(fileEO.getSrcname().getBytes("UTF-8"), "ISO8859-1");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
//设置文件名
response.setHeader("Content-Disposition", "attachment;fileName=" + realfilename);
fos = response.getOutputStream();
while ((size = bis.read(buf)) != -1)
fos.write(buf, 0, size);
fos.close();
bis.close();
return null;
}
return images;
}
}
4. jsp+js
在jsp中引入ajaxFileUpload,网上有这个插件的教程,这里不再描述。
需要注意的地方是 :
<input id="fileUpload" type="file" name="file" hidden="hidden">
id是在js中调用触发的,name是controller中对应的file:@RequestParam(value = "file") MultipartFile file 所以也是必须需要的。
function ajaxFileUpload() {
//上传图片
$.ajaxFileUpload({
url: ctx+'/file/upload', //文件上传到哪个地址,告诉ajaxFileUpload
secureuri: false, //一般设置为false
fileElementId: 'fileUpload', //文件上传控件的Id <input type="file" id="fileUpload" name="file" />
dataType: 'TEXT', //返回值类型(大写)小写在某些浏览器可能不成功
success:function(ajaxResult){ //服务器响应成功时的处理函数
var fileId = ajaxResult.replace(/<.*?>/ig, '');//ajaxFileUpload会对服务器响应回来的text内容加上<pre>text</pre>前后缀
$("#uploadedImage").attr("src",ctx+"/file/showImage/"+fileId);
$("#fileId").val(fileId);
},
error:function(data, status, e){ //服务器响应失败时的处理函数
alert("图片上传失败,请联系管理员!");
}
})
return false;
}