页面里你用uploadify或jquery之类的随意。
后台spring配置文件applicationContext.xml中配置
<!-- 限制上传文件尺寸,限制为5MB --><bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="5242880"/>
</bean>
controller的方法定义类似于,如果不一定需要上传文件的话,最好再加上if(!logo.isEmpty())的判断
@RequestMapping(value="/upload")public ModelAndView editSoftware(HttpServletRequest request,@RequestParam(required=false) MultipartFile logo){
ModelAndView view=new ModelAndView()
//定义上传路径
String path=request.getSession().getServletContext().getRealPath("/resources/upload/")
//获取上传文件的文件名
String fileName=logo.getOriginalFilename()
File file=new File(path, fileName)
try {
//保存文件
FileUtils.copyInputStreamToFile(logo.getInputStream(), file)
} catch (IOException e) {
e.printStackTrace()
}
view.setViewName("")
return view
}
我有一段上传图片的代码,并且可以根据实际,按月或按天等,生成存放图片的文件夹首先在JSP上放一个FILE的标签这些我都不说了,你也一定明白,我直接把处理过程给你发过去
我把其中存到数据库中的内容删除了,你改一下就能用
/**
*
* 上传图片
* @param servlet
* @param request
* @param response
* @return
* @throws Exception
*/
//这里我是同步上传的,你随意
public synchronized String importPic(HttpServlet servlet, HttpServletRequest request,HttpServletResponse response) throws Exception {
SimpleDate()Format formatDate() = new SimpleDate()Format("yyyyMM")
Date nowtime=new Date()
String formatnowtime=formatDate.format(nowtime)
File root = new File(request.getRealPath("/")+"uploadfile/images/"+formatnowtime+"/")//应保证在根目录中有此目录的存在 如果没有,下面则上创建新的文件夹
if(!root.isDirectory())
{
System.out.println("创建新文件夹成功"+formatnowtime)
root.mkdir()
}
int returnflag = 0
SmartUpload mySmartUpload =new SmartUpload()
int file_size_max=1024000
String ext=""
String url="uploadfile/images/"+formatnowtime+"/"
// 只允许上载此类文件
try{
// 初始化
mySmartUpload.initialize(servlet.getServletConfig(),request,response)
mySmartUpload.setAllowedFilesList("jpg,gif,bmp,jpeg,png,JPG")
// 上载文件
mySmartUpload.upload()
} catch (Exception e){
response.sendRedirect()//返回页面
}
com.jspsmart.upload.File myFile = mySmartUpload.getFiles().getFile(0)
if (myFile.isMissing()){ //没有选择图片做提示!
returnflag = 3
}else{
String myFileName=myFile.getFileName()//取得上载的文件的文件名
ext= myFile.getFileExt() //取得后缀名
if(ext.equals("jpg")||ext.equals("gif")||ext.equals("bmp")||ext.equals("jpeg")||ext.equals("png")||ext.equals("JPG")){ //jpeg,png不能上传!)
int file_size=myFile.getSize()//取得文件的大小
String saveurl=""
if(file_size<file_size_max){
try{
//我上面说到,把操作数据库的代友删除了,这里就应该是判断,你的图片是不是已经存在了,存在要怎么处理,不存在要怎么处了,就是你的事了}
//更改文件名,取得当前上传时间的毫秒数值
Calendar calendar = Calendar.getInstance()
//String filename = String.valueOf(calendar.getTimeInMillis())
String did= contractBean.getMaxSeq("MULTIMEDIA_SEQ")
String filename = did
String flag = "0"
String path = request.getRealPath("/")+url
String ename = myFile.getFileExt()
//.toLowerCase()转换大小写
saveurl=request.getRealPath("/")+url
saveurl+=filename+"."+ext //保存路径
myFile.saveAs(saveurl,mySmartUpload.SAVE_PHYSICAL)
//将图片信息插入到数据库中
// ------上传完成,开始生成缩略图-----
java.io.File file = new java.io.File(saveurl) //读入刚才上传的文件
String newurl=request.getRealPath("/")+url+filename+"_min."+ext //新的缩略图保存地址
Image src = javax.imageio.ImageIO.read(file)//构造Image对象
float tagsize=200
int old_w=src.getWidth(null)
int old_h=src.getHeight(null)
int new_w=0
int new_h=0
int tempsize
float tempdouble
if(old_w>old_h){
tempdouble=old_w/tagsize
}else{
tempdouble=old_h/tagsize
}
// new_w=Math.round(old_w/tempdouble)
// new_h=Math.round(old_h/tempdouble)//计算新图长宽
new_w=150
new_h=110//计算新图长宽
BufferedImage tag = new BufferedImage(new_w,new_h,BufferedImage.TYPE_INT_RGB)
tag.getGraphics().drawImage(src,0,0,new_w,new_h,null) //绘制缩小后的图
FileOutputStream newimage=new FileOutputStream(newurl) //输出到文件流
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(newimage)
encoder.encode(tag)//近JPEG编码
newimage.close()
returnflag = 1
}else{
returnflag = 0
System.out.println("('上传文件大小不能超过"+(file_size_max/1000)+"K')")
}
}else{
returnflag = 2
}
}
response.sendRedirect()
return "11"
}
环境准备
1. 下载并安装Tomcat(已经有很多关于Tomcat安装以及使用的文章,在这里不再介绍);
2. 下载File upload的jar包commons-fileupload-1.0-beta-1.jar,并将该文件拷贝到{$TOMCAT}/common/lib目录下(其中{$TOMCAT}为Tomcat的安装目录);
3. 由于Fileupload子项目同时要用到另外一个项目commons-Beanutils,所以必须下载Beanutils,并将解压后的文件commons-beanutils.jar拷贝到{$TOMCAT}/common/lib目录下。
开发文件上传页面
文件上传的界面如图1所示。为了增加效率我们设计了三个文件域,同时上传三个文件。
图1 文件上传界面
页面的HTML代码如下:
<html>
<head>
<title>文件上传演示</title>
</head>
<body bgcolor=“#FFFFFF”text=“#000000” leftmargin=“0”topmargin=“40”marginwidth=“0” marginheight=“0”>
<center>
<h1>文件上传演示</h1>
<form name=“uploadform”method=“POST” action=“save.jsp”ENCTYPE=“multipart/form-data”>
<table border=“1”width=“450”cellpadding=“4” cellspacing=“2”bordercolor=“#9BD7FF”>
<tr><td width=“100%”colspan=“2”>
文件1:<input name=“file1”size=“40”type=“file”>
</td></tr>
<tr><td width=“100%”colspan=“2”>
文件2:<input name=“file2”size=“40”type=“file”>
</td></tr>
<tr><td width=“100%”colspan=“2”>
文件3:<input name=“file3”size=“40”type=“file”>
</td></tr>
</table>
<br/><br/>
<table>
<tr><td align=“center”><input name=“upload” type=“submit”value=“开始上传”/></td></tr>
</table>
</form>
</center>
</body>
</html>
代码中要特别注意的是黑体处。必须保证表单的ENCTYPE属性值为multipart/form-data,这样浏览器才能正确执行上传文件的操作。
处理上传文件信息
由于本文主要是讲述如何使用Commons-fileupload,所以为了便于修改、调试,上传文件的保存使用一个JSP文件来进行处理。我们将浏览器上传来的所有文件保存在一个指定目录下并在页面上显示所有上传文件的详细信息。保存页面处理结果见图2所示。
图2 保存页面
下面来看看save.jsp的代码:
<%
/**
* 演示文件上传的处理
* @author <a href=“mailto:[email protected]”>Winter Lau</a>
* @version $Id: save.jsp,v 1.00 2003/03/01 10:10:15
*/
%>
<%@ page language=“java”contentType=“text/htmlcharset=GBK”%>
<%@ page import=“java.util.*”%>
<%@ page import=“org.apache.commons.fileupload.*”%>
<html>
<head>
<title>保存上传文件</title>
</head>
<%
String msg = “”
FileUpload fu = new FileUpload()
// 设置允许用户上传文件大小,单位:字节
fu.setSizeMax(10000000)
// maximum size that will be stored in memory?
// 设置最多只允许在内存中存储的数据,单位:字节
fu.setSizeThreshold(4096)
// 设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录
fu.setRepositoryPath(“C:\\TEMP”)
//开始读取上传信息
List fileItems = fu.parseRequest(request)
%>
<body bgcolor=“#FFFFFF”text=“#000000” leftmargin=“0”topmargin=“40”marginwidth=“0” marginheight=“0”>
<font size=“6”color=“blue”>文件列表:</font>
<center>
<table cellpadding=0 cellspacing=1 border=1 width=“100%”>
<tr>
<td bgcolor=“#008080”>文件名</td>
<td bgcolor=“#008080”>大小</td>
</tr>
<%
// 依次处理每个上传的文件
Iterator iter = fileItems.iterator()
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next()
//忽略其他不是文件域的所有表单信息
if (!item.isFormField()) {
String name = item.getName()
long size = item.getSize()
if((name==null||name.equals(“”)) &&size==0)
continue
%>
<tr>
<td><%=item.getName()%></td>
<td><%=item.getSize()%></td>
</tr>
<%
//保存上传的文件到指定的目录
name = name.replace(‘:’,‘_’)
name = name.replace(‘\\’,‘_’)
item.write(“F:\\”+ name)
}
}
%>
</table>
<br/><br/>
<a href=“upload.html”>返回上传页面</a>
</center>
</body>
</html>
在这个文件中需要注意的是FileUpload对象的一些参数值的意义,如下面代码所示的三个参数sizeMax、sizeThreshold、repositoryPath:
FileUpload fu = new FileUpload()
// 设置允许用户上传文件大小,单位:字节
fu.setSizeMax(10000000)
// maximum size that will be stored in memory?
// 设置最多只允许在内存中存储的数据,单位:字节
fu.setSizeThreshold(4096)
// 设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录
fu.setRepositoryPath(“C:\\TEMP”)
这3个参数的意义分别为:
SizeMax 用来设置上传文件大小的最大值,一旦用户上传的文件大小超过该值时将会抛出一个FileUploadException异常,提示文件太大;
SizeThreshold 设置内存中缓冲区的大小,一旦文件的大小超过该值的时候,程序会自动将其它数据存放在repositoryPath指定的目录下作为缓冲。合理设置该参数的值可以保证服务器稳定高效的运行;
RepositoryPath 指定缓冲区目录。
使用注意事项
从实际应用的结果来看该模块能够稳定高效的工作。其中参数SizeThreshold的值至关重要,设置太大会占用过多的内存,设置太小会频繁使用硬盘作为缓冲以致牺牲性能。因此,设置该值时要根据用户上传文件大小分布情况来设定。例如大部分文件大小集中在100KB左右,则可以使用100KB作为该参数的值,当然了再大就不合适了。使用commons-fileupload来处理HTTP文件上传的功能模块很小,但是值得研究的东西很多。