-
- 需求
- 所需jar包
- springmvcxml开启文件上传
- 简单上传界面
- ajax提交图片表单
- UploadController
- 测试
struts2都支持文件的上传,更好的springmvc当然也支持了~
这里就来用一个小例子来实现
需求 上传图片,图片里面回显。
使用Ajax可以实现页面不刷新图片回显。
所需jar包 【【java】|springmvc+jersey实现图片跨服务器上传到并回显】由于此案例是文件的上传,所以除了springmvc本来的jar包外还需要:
- 文件上传:com.springsource.org.apache.commons.fileupload-1.2.0.jar
- 文件的读写:com.springsource.org.apache.commons.io-1.4.0.jar
由于是跨服务器上传,这里是通过jersey实现的: - jersey-client-1.18.jar
- jersey-core-1.18.jar
简单上传界面 form表单里一个图片标签,一个文件选择按钮
ajax提交图片表单 由于我们要实现图片的回显,使用ajax是毋容置疑的,可是通常我们使用ajax发送的数据只能是json或者字符串类型。图片类型的文件应该怎么发送呢?以前我们是怎么上传图片的呢?聪明的你一定想到了,是的form表单。以前我们是通过form表单来上传文件,ajax能不能用来提交表单呢?答案是肯定的。
使用jquery.form.js 异步提交form插件。
- ajax提交form表单
- 由于图片需要回显,所以服务器需要返回图片的绝对路径
$(function(){
$("#uploadimg").change(function(){
var option={
url:"${pageContext.request.contextPath}/upload/uploadImg.do",
type:"post",
dataType:"text",
data:{fileName:"uploadimg"},
success:function(data){
//把json格式的字符串转换成json对象
var dataObj=$.parseJSON(data);
//返回服务器的图片路径,并把图片的路径设置给img标签
$("#img").attr("src",dataObj.fullPath);
}
};
//上传表单
$("#imgform").ajaxSubmit(option);
});
});
UploadController
- 由于要获得上传的文件,所需参数要有request对象和文件的名称fileName,ajax需要回显图片,需要PrintWriter
- 由于上传的文件是流类型直接使用request对象无法获得.需要把request对象强转为多部件请求对象MultipartHttpServletRequest ,然后就可以通过文件名称来获得。至于为何可以强转为多部件请求对象MultipartHttpServletRequest ,是因为我们是使用ajax提交表单,根本没使用enctype.
- 由于文件名可能会出现重名,所以我使用当前时间+5个随机数作为新图片的文件名称
- 然后就是使用jesey上传图片到远程服务器了。这时候需要在远程服务器的conf/web.xml中配置一个初始变量
-
文章图片
- 最后就是ajax返回的图片的绝对路径了~
@Controller
@RequestMapping("/upload")
public class UploadController {
@RequestMapping("uploadImg")
public void uploadImg(HttpServletRequest request,String fileName,PrintWriter pw){
//把request强转为多部件请求对象
MultipartHttpServletRequest req=(MultipartHttpServletRequest) request;
//根据文件名称获得文件对象
CommonsMultipartFile img = (CommonsMultipartFile) req.getFile(fileName);
//获取文件上传流
byte[] fbytes = img.getBytes();
//文件名在服务器可能有重复
String newfileName=System.currentTimeMillis()+"";
Random r=new Random();
for(int i=0;
i<5;
i++){
newfileName+=r.nextInt(100);
}
//获取文件的扩展名
String originalFilename = img.getOriginalFilename();
String suffix=originalFilename.substring(originalFilename.lastIndexOf("."));
//创建jesy服务器 进行跨服务器上传
Client client=Client.create();
//把文件关联到远程服务器
WebResource resource = client.resource("http://123.123.123.123/upload/"+newfileName+suffix);
//上传
resource.put(fbytes);
/*
* ajax回调函数所需的参数
* fullPath:图片回显所需的完整路径
*/
String fullPath="http://123.123.123.123/upload/"+newfileName+suffix;
String result="{\"fullPath\":\""+fullPath+"\"}";
pw.write(result);
}
}
测试
前几天在拉勾网投了java实习生的简历,总共来了四个电话,,前三个都是问了一些无关痛痒的东西,也没说面试的事情。估计是培训吧,今天有一个公司对我进行了电话面试,由于还没看过面试题,觉得如果是100分制的能得65分。。。也不知道结果如何。。觉得有个公司要我去实习就是好的 ,,,哈哈 想锻炼一下自己了
推荐阅读
- Java|Java基础——数组
- 人工智能|干货!人体姿态估计与运动预测
- java简介|Java是什么(Java能用来干什么?)
- Java|规范的打印日志
- Linux|109 个实用 shell 脚本
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- Spring注解驱动第十讲--@Autowired使用
- =======j2ee|spring用注解实现注入的@resource,@autowired,@inject区别
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验
- jvm|【JVM】JVM08(java内存模型解析[JMM])