file 文件上传必须依赖表单,ajax不行!
<form action="${path }/item/addBrand.do" method="post" enctype="multipart/form-data">
<input type='file' οnchange='submitUpload()' />
创建 JS 方法 submitUpload()
function submitUpload(){
var option = {
url:"${path}/upload/uploadPic.do",//如果不写url就是默认使用要提交的表单中的url,如果有url就是使用该url
dataType:"text",
success:function(responseText){
//把json格式字符串转换成json对象
var jsonObj = $.parseJSON(responseText);
$("#imgsImgSrc").attr("src", jsonObj.realPath);
$("#imgs").val(jsonObj.relativePath);
$("#lastPath").val(jsonObj.realPath);
},
error:function(){
alert("系统错误");
}
};
//ajax方式提交表单,页面不会跳转(由jQuery-form提供)
$("#form111").ajaxSubmit(option);
}
在 springmvc.xml 中需要配置一个解析器
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="1024000"></property>
</bean>
未上传图片单独创建一个 Controller
@Controller
@RequestMapping("/upload")
public class EbUploadController {
@RequestMapping("/uploadPic.do")
public void uploadPic(HttpServletRequest request, PrintWriter out, String lastPath) throws IOException{
//强制转换request,只有 MultipartHttpServletRequest 才能转换 file
MultipartHttpServletRequest mr = (MultipartHttpServletRequest) request;
//获得文件,即<input type="file" name=""/>中的值
Iterator<String> iter = mr.getFileNames();
String fileInputName = iter.next();
MultipartFile mf = mr.getFile(fileInputName);
//将获得的文件,转化为字节数组
byte[] byteArr = mf.getBytes();
//为了让文件名不重复,用“文件名 + 时间戳(精确到毫秒数) + 3位随机数”
String fileName = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date());
Random random = new Random();
for(int i = 0 ; i < 3; i++){
fileName = fileName + random.nextInt(10);
}
//获得原始文件后缀名
String oriFileName = mf.getOriginalFilename();
String suffix = oriFileName.substring(oriFileName.lastIndexOf("."));
//获得文件服务器的主机地址(格式:绝对路径)
String filePath = ECPSUtils.readProp("file_path");
//获得上传文件的绝对路径
String realPath = filePath + "/upload/"+fileName + suffix;
String relativePath = "/upload/"+fileName + suffix; <————此处是保存进DB的相对路径
保存相对路径是防止后期主机地址变化
//开始上传,这里借助 Jersey 框架。 Jersey 是专门做两台机器间通信的。
Client client = Client.create();
if(StringUtils.isNotBlank(lastPath)){
WebResource wr1 = client.resource(lastPath);
wr1.delete();
}
//创建Jersey客户端, 返回值是获得的服务器端位置信息
WebResource wr = client.resource(realPath);
wr.put(byteArr);
//ajax返回多个值的时候要使用JSON
JSONObject jo = new JSONObject();
jo.accumulate("realPath", realPath);
jo.accumulate("relativePath", relativePath);
//获得json格式的字符串——{"realPath":"http://.....", "relativePath":"/upload/..."}
String result = jo.toString();
out.write(result);
}
}