最近在做一个公司的项目,使用了layUI 这个前端框架。
在做到上传图片这个功能的时候,由于layUI提供的是AJAX异步上传图片的方式,需要自己编辑上传的接口,本人编辑controller如下:
@RequestMapping("/upLoadIcon")
public void upLoadIcon(@RequestParam(value="pic")MultipartFile pic,HttpServletRequest request,HttpServletResponse response,Image image) throws Exception{
if(pic.getOriginalFilename().length()>0){
//原始文件名称
String pictureFile_name = pic.getOriginalFilename();
//新文件名称
String newFileName = UUID.randomUUID().toString()+pictureFile_name.substring(pictureFile_name.lastIndexOf("."));
//记录上传日期,按日期存放
SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMdd");
String fmtDate=sdf.format(new Date());
//打开文件流
File file = new java.io.File("F:/develop/upload/temp/",fmtDate);
//如果文件夹不存在,立即创建
if(!file.exists()){
file.mkdirs();
}
File file2=new File(file,newFileName);
try {
pic.transferTo(file2);
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
String newName = fmtDate+"/"+newFileName; //文件新名字
if (newName!=null) {
image.setUrl(newName);
Contants.printJson(image, response);
}
}
}
至于Image这个类是我写的一个工具类 ,里面就一个属性:url 用来存 newName这个值的,方便转成json传回。下面是 Contants这个工具类的源码:
public class Contants {
/**
* JSON
* @param object
* @param response
* @throws Exception
*/
public static void printJson(Object object,HttpServletResponse response) throws Exception
{
Gson gson=new Gson();
String json=gson.toJson(object);
response.setCharacterEncoding("UTF-8");
PrintWriter out=response.getWriter();
out.print(json);
/*System.out.println(json);*/
out.flush();
out.close();
}
}
就是一个普通的转json的工具类,需要导入gson-2.7.jar
经过这两步后我在前端明明拿到了返回的newName,但是却怎么也没办法赋值给 这个标签,不管是用.val() 还是 attr({"value":""})都无济于事,前端返回数据的js如下:
layui.upload({
url: '<%=basePath%>sysmenu/upLoadIcon',
success: function(res){
// console.log(res.url);
// console.log($('#menuicon').val());//查看原本的value值
$('#menuicon').val(res.url);
//console.log($('#menuicon').val());//查看现在的value值
}
});
后来在网上终于查到了一个比较简单的思路:改变映射。
参考:http://www.cnblogs.com/shenyixin/archive/2013/11/19/3431883.html
根据上面链接里的描述,得出了一个未经考证的说法:因为安全问题,file框是不允许赋值的!!!
这样一来问题就可以迎刃而解了!既然file框不能赋值,那我们完全可以写一个隐藏的text框 通过设置它的name属性,把url赋值给它,然后通过这个隐藏的input和后台controller进行提交! 事实证明这个方法是绝对有效的,并且相当之简单!