springmvc实现文件blob二进制文件上传到数据库
1、整体实现思路
1)数据库字段类型设置为blob
2)前台ajax请求
3) 后台使用MultipartFile
2、代码实现
前端:
//开始提交数据
var fileName2 ='';
var fileArrs = [];
for(var i=0;i<fileArr.length;i++){
var elementSuffix = extname_id(fileArr[i].id);//获取文件位置
var textVal = document.getElementById("filetext_"+elementSuffix).value;//新文件名称
var filesuffix = extname(fileArr[i].files[0].name);//获取文件后缀名
var filename = textVal+"."+filesuffix;//拼接成完整的文件名
fileName2 = textVal;
//生成新文件
var file = new File([fileArr[i].files[0]], filename, {
type: fileArr[i].files[0].type
});
formDataStart.append('file',file); // 传入文件
formDataStart.append('fjmc',textVal);
}
formDataStart.append('fjlx',fjtype);
formDataStart.append('sszxmid',_objId);
formDataStart.append('xmlx',xmlx);
$.ajax({
url: path,
type: "post",
data: formDataStart,
async: false,
contentType:false, //- 必须false才会自动加上正确的Content-Type
processData: false, //- 必须false才会避开jQuery对 formdata 的默认处理,XMLHttpRequest会对 formdata 进行正确的处理
success : function(res) {
if(res.successful) {
mx.indicate("info", "上传成功");
var win = me.tpHSplit.parent;
if($instanceOf(win, mx.windows.Window)) {
var gzlx = me.tabControl.selection.name;
if('jg'==gzlx){
me.jgGrid.load();
}else{
me.dxGrid.load();
}
win.hide();
}
}else{
mx.indicate("info", res.msg);
}
}
});
后端:
/**
* zsk 实体类
* request
**/
public Map<String, Object> uploadFile(zsk zsk,HttpServletRequest request) throws IOException {
Map<String, Object> resultMap = new HashMap<String, Object>();
for(int i = 0; i<zsk.getFile().length;i++){ // 可以上传多个文件,遍历
MultipartFile mfile1 = zsk.getFile()[i];
if (mfile1==null || mfile1.isEmpty()){ // 空文件判断
resultMap.put("successful", false);
resultMap.put("msg", "文件上传失败!");
}
System.out.println("name: " + mfile1.getOriginalFilename() + " size: " + mfile1.getSize());
String urlname = UUID.randomUUID().toString() + "_" + mfile1.getOriginalFilename();
String base64Str = null;
try {
base64Str = Base64Utility.encode(mfile1.getBytes()); // 转base64
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
FileOutputStream fos = null;
try {
resultMap.put("successful", true);
resultMap.put("stream", base64Str);
// 转二进制存入数据库blo字段
byte[] byteFile = Base64Utility.decode(base64Str);
resultMap.put("realFileName",mfile1.getOriginalFilename());
String scSql = "insert into t_jgdx_xmfjb(obj_id,fjmc,scsj,wjlx,sfcg,wjlxbm,sszxmid,realname,xmlx,wjlj,WJ)"+
" values(sys_guid(),?,sysdate,?,?,?,?,?,?,?,?)";
hibernateDao.executeSqlUpdate(scSql,new Object[]{zsk.getFjmc(),zsk.getFjlx(),'0',zsk.getFjlx(),zsk.getSszxmid(),mfile1.getOriginalFilename(),zsk.getXmlx(),"/app/ywfz/jgdx/jpg/"+ urlname,byteFile});
resultMap.put("successful", true);
resultMap.put("msg", "文件上传成功!");
} catch (Exception e) {
e.printStackTrace();
resultMap.put("successful", false);
resultMap.put("msg", "文件上传失败!");
} finally {
}
}
return resultMap;
}
3、常见问题总结
1、后台接收不到文件
解决办法:放在实现类里
public class zsk {
...
private MultipartFile[] file;
public MultipartFile[] getFile() {
return file;
}
public void setFile(MultipartFile[] file) {
this.file = file;
}
}
2、前端请求注意以下设置
contentType:false, //- 必须false才会自动加上正确的Content-Type
processData: false, //- 必须false才会避开jQuery对 formdata 的默认处理,XMLHttpRequest会对 formdata 进行正确的处理
3、后台接收注意加注解@ResponseBody
@RequestMapping(value = "/uploadFile",method = RequestMethod.POST)
@ResponseBody
public Map<String, Object> uploadFile(zsk zsk, HttpServletRequest request) {
try{
return uplodaBizc.uploadFile(zsk, request);
}catch(Exception e){
throw new RestClientException("方法异常",e);
}
}
版权声明:本文为qq_38138791原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。