JSP实现文件上传功能
本文实例为大家分享了jsp实现文件上传功能的具体代码,供大家参考,具体内容如下
一、准备部分
需要fileupload.jar与io.jar包共同完成。构建完成路径后可继续。
二、页面部分
<form action="uploadservlet" method="post" enctype="multipart/form-data"> 学号:<input type="text" name="sno"/><br/> 姓名:<input type="text" name="sname"/><br/> 上传照片:<input type="file" name="spicture"/><br/> <input type="submit" value="注册"/> </form>
注意:
1.文件上传必须要使用post,以避免用get方法时传输总量超过搜索框所能承载最大字符数。
2.必须加入enctype="multipart.form-data"字段
3.文件处需用“file”
三、servlet部分
package webtest; import java.io.file; import java.io.ioexception; import java.util.iterator; import java.util.list; import javax.servlet.servletexception; import javax.servlet.annotation.webservlet; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; import org.apache.commons.fileupload.fileitem; import org.apache.commons.fileupload.fileitemfactory; import org.apache.commons.fileupload.fileuploadbase; import org.apache.commons.fileupload.fileuploadexception; import org.apache.commons.fileupload.disk.diskfileitemfactory; import org.apache.commons.fileupload.servlet.servletfileupload; /** * servlet implementation class uploadservlet */ @webservlet("/uploadservlet") public class uploadservlet extends httpservlet { private static final long serialversionuid = 1l; protected void doget(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception { request.setcharacterencoding("utf-8");// 请求编码处理,传输时 response.setcharacterencoding("utf-8");// 响应编码处理,传输时 response.setcontenttype("utf-8");// 响应编码处理,显示时 boolean ismultipart = servletfileupload.ismultipartcontent(request);// 判断是否有entype="multipart/form-data"部分 if (ismultipart) { try { fileitemfactory factory = new diskfileitemfactory(); servletfileupload upload = new servletfileupload(factory); //设置上传时的内存缓冲区大小,超出时写入临时文件 10kb ((diskfileitemfactory) factory).setsizethreshold(10240);//单位byte //设置临时文件目录,防止系统空间不足 ((diskfileitemfactory) factory).setrepository(new file(request.getsession().getservletcontext().getrealpath("uploadtemp")));//动态获取uploadtemp文件夹位于该项目中的位置 //控制上传单个文件的最大值 20kb upload.setsizemax(20480);//单位byte list<fileitem> items = upload.parserequest(request);// 解析form中的所有请求字段,并保存在item中 iterator<fileitem> iter = items.iterator(); while (iter.hasnext()) { // 解析时无顺序,因此需根据名字查找 fileitem item = iter.next(); if (item.isformfield()) {//非文件数据 string itemname = item.getfieldname();//获取非文件的范围数据名 if (itemname.equals("sno")) { int sno = -1; sno = integer.parseint(item.getstring("utf-8")); } else if (itemname.equals("sname")) { string sname = null; sname = item.getstring("utf-8"); } else { system.out.println("其他字段..."); } } else {//文件上传 string filename = item.getname();//获取文件范围数据。路径及其名称 //判断文件类型 string ext = filename.substring(filename.indexof(".")+1); if(!(ext.equals("png")||ext.equals("gif")||ext.equals("jpg"))) { system.out.println("仅支持png.gif,jpg类型文件"); return ; } string path = request.getsession().getservletcontext().getrealpath("upload");//动态获取upload文件夹位于该项目中的位置 file file = new file(path,filename); item.write(file);//定义上传路径,多为服务器路径 system.out.println(filename+"上传成功"); } item.delete();//删除临时目录的文件 } } catch(fileuploadbase.sizelimitexceededexception e) { system.out.println("最大20kb"); } catch (fileuploadexception e) { // todo auto-generated catch block e.printstacktrace(); } catch (exception e) { // todo auto-generated catch block e.printstacktrace(); } } } /** * @see httpservlet#dopost(httpservletrequest request, httpservletresponse * response) */ protected void dopost(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception { // todo auto-generated method stub doget(request, response); } }
注:
1.若该处标红且鼠标悬停后未找到包,则可以使用"alt"+"/"组合键选择下图第一个类来导入。
2.由于若upload与uploadtemp文件存放于tomcat对应的项目下,每一次通过eclipse更新代码,会将eclipse下代码直接覆盖,因而两个文件夹会直接被覆盖掉。可以在eclipse中新建,或通过绝对/相对路径于其他文件夹中来设置。
3.临时文件中的数据会保留很短的时间,添加sleep让程序休眠也许可以看到。即使无item.delete(),在整个会话完成后,临时文件也会被删除。
4.若报错无法找到文件,请尝试用浏览器若谷歌进行操作,而不是用eclipse自带的。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持硕编程。