其实图片上传有好多种方法,一般不建议文件或者文件转码放到数据库中 ,因为太大 还会失真,簡単的就是传到到服务器的自定义的目录下面。
废话少说 简单说下流程,1.jsp(浏览图片名称)---2.XML(过滤限制文件大小,格式等)---3.java(转成流 并读写到指定目录)---4.jsp(浏览图片),我就简单分成4块。
(整个项目的完整代码的下载地址在最下面,但我觉得还是好好看看自己实践的好 注:案例的框架是 Struts2+MyBatis+Sping框架是我CSDN下的,下载后直接访问userAdd.jsp)
(1).JSP上传
用的是struts的S标签 所以别忘了在JSP上开头加上 <%@ taglib prefix="s" uri="/struts-tags"%> 还有就是 enctype="multipart/form-data" 是编码格式的意思 这里し上传二进制数据的意思,上传的话必须加上 不加的话 JSP是默认编码格式是application/x-www-form-urlencoded。
<s:form action="addUser" namespace="/user" method="post" enctype="multipart/form-data">
<div style="font-size:14px">
图片上传
<input type="file" name="file" value="选择"/>
<input type="submit" value="确定"/>
</div>
</s:form>
2.XML(过滤限制文件大小,格式等)
struts 的6个jar包中有一个commons-fileupload-1.2.2.jar ,struts的上传下载作用。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<!-- 指定国际化资源文件的baseName为messageResource -->
<constant name="struts.custom.i18n.resources" value="messageResource"/>
<!-- 设置该应用使用的解码集 -->
<constant name="struts.i18n.encoding" value="utf-8"/>
<!-- 上传的全部图片的最大限制-->
<constant name="struts.multipart.maxSize" value="1024102400"/>
<constant name="struts.configuration.xmlreload" value="true"/>
<!-- 当struts配置文件修改时是否自动加载 -->
<constant name="struts.devMode" value="true"/>
<!-- 开发模式下打印详细的错误信息 -->
<constant name="struts.ui.theme" value="xhtml"/>
<package name="user" namespace="/user" extends="struts-default">
<action name="listUser" class="userAction" method="queryAllUser">
<result name="success">/userAdd.jsp</result>
</action>
<action name="addUser" class="userAction" method="add">
<interceptor-ref name="fileUpload">
<param name="allowedTypes">
image/bmp,image/png,image/gif,image/jpeg,image/jpg
</param>
<param name="maximumSize">502400</param>
</interceptor-ref>
<!-- 默认的拦截器,必须要写 -->
<interceptor-ref name="defaultStack" />
<result name="success" type="redirectAction">listUser.action</result>
</action>
</package>
</struts>
从上面的配置中很简单看出,就是走Action用拦截器控制一下大小和格式,当然你实际开发的时候,前台的JS和后台的java都要控制的。
3.java(转成流 并读写到指定目录)
发布后项目中的所有都是部署大屏tomcat(以它为例)下面的webapps的, 所以我直接把图片传到webapps下面 的工程下面以就可以了,建一个目录叫upload,我的目录是user/upload (注意:有的是直接在项目下面就建的目录,也行 不过必须刷新下才能出来,因为tomcat会同步你的项目,当然这里是可以配置的)
File file = new File("文件夹");//创建新文件
if(file!=null && !file.exists()){
file.createNewFile();
}
也可以选择让JAVA来创建文件夹的
下面看代码
private List<File> file;
private List<String> fileFileName;
private List<String> fileContentType;//这些基本改声明的变量还是要的和get set方法
public String add() throws IOException {
// request.getSession().getServletContext().getRealPath("") 参数可具体到包名。//也可获得
String tomcatAdress="D:\\apache-tomcat-6.0.26\\webapps\\optionLog\\user\\upload"//这换成你要放图片的路径,但记住是tomcat中你项目的指定目录下
File a =new File(tomcatAdress);
String patch=a.getPath();
String imgAdress = null;
for(int i = 0 ; i < file.size() ; i ++){
InputStream is = new FileInputStream(file.get(i));
//得到图片保存的位置(根据patch来得到图片保存的路径在tomcat下的该工程里)
File destFile = new File(patch,System.currentTimeMillis()+this.getFileFileName().get(i));
imgAdress=System.currentTimeMillis()+this.getFileFileName().get(i);
//把图片写入到上面设置的路径里
OutputStream os = new FileOutputStream(destFile);
byte[] buffer = new byte[1024];
int length = 0 ;
while((length = is.read(buffer))>0){
os.write(buffer, 0, length);
}
is.close();
os.close();
}
user.setImgAdress(imgAdress);
userService.addUser(user);//user是一个对象有好多属性 imgAdress只是其中之一
return "success";
}
把当前时间+图片文件放到数据库imgAdress字段里面
4.jsp(浏览图片)
这就简单了 和正常查询一样
optionLog 是我的项目名 后面是文件夹名 当然你可以用 <%=this.getServletContext().getContextPath()%> 获得项目名称
<s:iterator value="userList">
<tr>
<td> <img src="/optionLog/user/upload/<s:property value="imgAdress"/>"/></td>
</tr>
</s:iterator>
帅气头像展示
完整3大框架上传案例的下载地址:http://download.csdn.net/download/gjldwz/6711995