实际项目中可能要用到单独的文件服务器, 这时候可以使用jersey上传文件的方法达到分离文件服务器和主服务器。于是通过查询资料以及不断尝试,终于走出了这个图片上传一直报错的困扰,现在将代码贴上,希望对后来者有帮助:
欣赏结果
具体操作
创建图片服务器
1)修改tomcat配置, 允许文件写操作,修改conf目录下的web.xml, 添加readonly参数为false。
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
2)创建一个web项目,如image-web,新建文件夹upload(用于存储位置),并打成war包,放入我们图片服务器Tomcat中webapps下 。
编写上传服务器
1)新建项目
2)导入相关架包
<!-- 添加jersey支持 -->
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
<version>1.19</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.19</version>
</dependency>
<!-- 添加Spring支持 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
3)配置相关文件
web.xml
<!-- Spring配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/applicationContext.xml</param-value>
</context-param>
<!-- 编码过滤器 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- Spring监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 添加对springmvc的支持 -->
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<!-- <async-supported>true</async-supported> -->
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
spring-mvc.xml
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8"/>
<property name="maxUploadSize" value="10000000"/>
</bean>
4)编写相关代码
UploadController.java
/**
* 图片上传
* @param request
* @return
*/
@RequestMapping(value = "/upload", method = RequestMethod.POST)
public String upload(HttpServletRequest request) {
MultipartHttpServletRequest req = (MultipartHttpServletRequest) request;
Iterator<String> iter = req.getFileNames();
Map<String, Object> map = new HashMap<String,Object>() ;
Gson gson = new Gson() ;
if (iter.hasNext()){
String fileName = iter.next();
MultipartFile file = req.getFile(fileName);
fileName = file.getOriginalFilename();
String suffix = fileName.substring(fileName.lastIndexOf(".")) ;
// 图片名称生成策略
DateFormat df = new SimpleDateFormat("yyyyMMddHHmmssSSS");
String format = df.format(new Date()) ;
// 三位随机数
Random r = new Random() ;
for(int i=0; i<3; i++) {
format +=r.nextInt(10) ;
}
Client client = Client.create();
String URL = "http://localhost:8800/image-web/upload/" ;
if (".png".equalsIgnoreCase(suffix) || ".jpg".equalsIgnoreCase(suffix) || ".gif".equalsIgnoreCase(suffix)) {
WebResource resource = client.resource(URL + format + suffix);
try {
resource.put(String.class, file.getBytes());
map.put("status", 200) ;
map.put("url", URL+format + suffix) ;
map.put("message", "上传成功!") ;
} catch (IOException e) {
e.printStackTrace() ;
map.put("status", 500) ;
map.put("url", "") ;
map.put("message", "上传失败!") ;
}
} else {
map.put("status", 500) ;
map.put("url", "") ;
map.put("message", "上传失败! 图片格式不正确!") ;
}
}
return gson.toJson(map) ;
}
index.jsp
<div class="container-fluid">
<div class="row">
<div class="col-md-2"> </div>
<div class="col-md-8" style="height:300px">
<div class="bs-callout bs-callout-info">
<h3 align="center"><b>使用Jersey+SpringMVC 实现上传图片到图片服务器</b></h3>
<h4 align="right">----------- bootstrap fileinput.js上传图片实例</h4>
</div>
<!-- <h3 align="center">bootstrap fileinput.js上传多张图片实例</h3> -->
<form action="<c:url value="/upload.html"/> " method="post" enctype="multipart/form-data">
<input type="file" id ="projectfile" class="projectfile" name="file" multiple class="file-loading"/>
<p class="help-block">支持jpg、png、gif格式</p>
</form>
</div>
<div class="col-md-2"> </div>
</div>
</div>
<script type="text/javascript">
$(function () {
//0.初始化fileinput
var oFileInput = new FileInput();
// 图片上传
oFileInput.Init("projectfile", "${pageContext.request.contextPath}/upload.html");
});
var FileInput = function () {
var oFile = new Object();
//初始化fileinput控件(第一次初始化)
oFile.Init = function(ctrlName, uploadUrl) {
var control = $('#' + ctrlName);
//初始化上传控件的样式
control.fileinput({
language: 'zh', //设置语言
uploadUrl: uploadUrl, //上传的地址
allowedFileExtensions: ['jpg', 'gif', 'png'],//接收的文件后缀
showUpload: true, //是否显示上传按钮
browseClass: "btn btn-info", //按钮样式
maxFileCount: 10, //表示允许同时上传的最大文件个数
initialCaption: "请上传XXX图片...",//文本框初始话value
validateInitialCount:true,
previewFileIcon: "<i class='glyphicon glyphicon-king'></i>",
msgFilesTooMany: "选择上传的文件数量({n}) 超过允许的最大数值{m}!",
});
var html = "" ;
//导入文件上传完成之后的事件
$("#projectfile").on("fileuploaded", function (event, data, previewId, index) {
if(data.response && data.response.status !==200) {
layer.msg(data.response.message);
} else {
layer.alert(data.response.message, {
skin: 'layui-layer-molv' //样式类名
,closeBtn: 0
}, function(){
html += '<img alt="" src="'+data.response.url+'">' ;
layer.alert(html, {
skin: 'layui-layer-lan'
,closeBtn: 0
,anim: 4 //动画类型
});
});
}
});
}
return oFile;
};
</script>
使用Jersey + SpringMVC 上传图片到图片服务器到此结束。本篇为wenteryan原创,转载请注明出处:http://blog.csdn.net/wenteryan