利用commons-fileupload实现文件的上传(源码)
2011-11-24 19:51
585 查看
现在我们利用commons-fileupload实现文件的上传,
开发环境:Myeclipse 9.0
对文件上传的细节分析:
1、乱码问题的出现与解决 2、上传文件类型的约束 3、上传文件的大小约束
4、临时缓存文件的处理 5、服务器端文件的保存 6、文件名相同覆盖问题
7、多文件同时上传问题 等…………
实现:
在Myeclipse 9.0 创建一个web project ,新建一个jsp命名为:myupload.jsp
源码:
需要主要的是:from里面用到了一个隐藏的input用来标记file项。这里还引用了一个名为:addelement.js的javascript文件,用来实现动态添加和删除上传文件的项。
addelement的源码:
指定了编码"UTF-8"的方式。
解决方法,1、在引入js时指定js的编码方式(js的保存方式),<script type="text/javascript" src="addelement.js" charset="GBK"></script>即可。
2、在Myeclipse下右击js文件选择Properties项,在Text file encoding中选择other 在选择UTF-8即可。这时再打开js文件里面的汉字都成了乱码,删除
乱码汉字重新编写一下即可。
创建一个人servlet包,在包中创建一个servlet用来处理提交的表单:
UploadServlet源码:
这样文件上传就实现了。
程序的不足和知识的误点还请各位读者多多交流。
开发环境:Myeclipse 9.0
对文件上传的细节分析:
1、乱码问题的出现与解决 2、上传文件类型的约束 3、上传文件的大小约束
4、临时缓存文件的处理 5、服务器端文件的保存 6、文件名相同覆盖问题
7、多文件同时上传问题 等…………
实现:
在Myeclipse 9.0 创建一个web project ,新建一个jsp命名为:myupload.jsp
源码:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>文件上传</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <script type="text/javascript" src="addelement.js"></script> </head> <body> <form action="${pageContext.request.contextPath}/servlet/UploadServlet" method="post" enctype="multipart/form-data"> <input type="hidden" name="hidden" value="1" id="hidden"> 用户: <input type="text" name="user"> <input type="button" value="上传文件" onclick="addElement()"> <input type="button" value="删除" onclick="deleteElement()"> <div id="upload_div" style="width: 300px;"> </div> <input type="submit" value="提交"> </form> </body> </html>
需要主要的是:from里面用到了一个隐藏的input用来标记file项。这里还引用了一个名为:addelement.js的javascript文件,用来实现动态添加和删除上传文件的项。
addelement的源码:
function addElement() { //得到隐藏input里面的value值 var index = document.getElementById("hidden").getAttribute("value"); if(index>4){ alert("最大同时上传4个文件"); return false; } //创建一个input类型的节点 var inputElement = document.createElement("input"); //设置新创建的节点的属性,类型为file,name值递增 inputElement.setAttribute("type", "file"); inputElement.setAttribute("name", "file" + index); //创建文本节点 var fontElement = document.createTextNode("选择文件:"); //将创建的文本节点添加到div中 document.getElementById("upload_div").appendChild(fontElement); //将创建的input类型的节点添加到div中 document.getElementById("upload_div").appendChild(inputElement); //创建一个换行 var brElement = document.createElement("br"); //添加到div中 document.getElementById("upload_div").appendChild(brElement); //将隐藏input里面的value值加1 document.getElementById("hidden").setAttribute("value", parseInt(index) + 1); } function deleteElement() { //因为add方法添加了3个节点循环三次 for ( var i = 0; i < 3; i++) { //删除最后一个节点 document.getElementById("upload_div").removeChild( document.getElementById("upload_div").lastChild); } //将隐藏input里面的value值设为1 document.getElementById("hidden").setAttribute("value",1); }在jsp页面中引入js文件时,可能会出现乱码。原因,因为在Myeclipse下文件保存的默认编码是本地的默认编码,一般是GBK,而jsp页面保存的时候
指定了编码"UTF-8"的方式。
解决方法,1、在引入js时指定js的编码方式(js的保存方式),<script type="text/javascript" src="addelement.js" charset="GBK"></script>即可。
2、在Myeclipse下右击js文件选择Properties项,在Text file encoding中选择other 在选择UTF-8即可。这时再打开js文件里面的汉字都成了乱码,删除
乱码汉字重新编写一下即可。
创建一个人servlet包,在包中创建一个servlet用来处理提交的表单:
UploadServlet源码:
package cn.zc.servlet; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.util.Arrays; import java.util.List; import java.util.UUID; import javax.servlet.ServletException; 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.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; public class UploadServlet extends HttpServlet { /** * Constructor of the object. */ public UploadServlet() { super(); } /** * Destruction of the servlet. <br> */ public void destroy() { super.destroy(); // Just puts "destroy" string in log // Put your code here } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //判断表格的提交方式是否是multipart/form-data类型 if(!ServletFileUpload.isMultipartContent(request)){ //如果不是该类型,采用普通方式处理。 //response.setContentType("text/html;charset=utf-8"); //PrintWriter out = response.getWriter(); //request.getParameter("user");//此时便可以使用request.getParameter方法 //为了方便在此直接退出 return ; } //创建一个解析工厂 DiskFileItemFactory factory=new DiskFileItemFactory(); //设置临时缓存文件的保存目录 factory.setRepository(new File(this.getServletContext().getRealPath("/temp"))); //得到解析器对象 ServletFileUpload upload=new ServletFileUpload(factory); //设置保存文件的编码方式, upload.setHeaderEncoding("UTF-8"); try{ //设置上传文件的最大值大小,最大值为200MB upload.setFileSizeMax(1024*1024*200); //定义规定上传文件的类型 String[]arr={".jpg",".zip",".txt",".ppt",".pptx",".doc",".docx",".xls",".gif"}; //将类型放到List中 List fileStandType=Arrays.asList(arr); //对请求进行解析,有几个输入项就会有几个FileItem对象 List<FileItem> items=upload.parseRequest(request); for(FileItem item:items){ //判断输入元素的类型, if(item.isFormField()){//是普通项 //得到name属性 String inputName=item.getFieldName(); //得到相对应的值 String inputValue=item.getString("UTF-8");//可指定字符编码,以防乱码 System.out.println(inputName+" : "+inputValue); }else{//是上传文件输入项 //获取上传文件名称 String fileName=item.getName(); //判断fileName是否为空即是否真的选择了上传文件,不为空继续 if(!fileName.trim().equals("")){ //对文件名进行处理得到文件名 fileName=fileName.substring(fileName.lastIndexOf("\\")+1); //得到文件后缀判断文件类型 String fileType=fileName.substring(fileName.lastIndexOf(".")); //判断是否是制定的文件类型 if(!fileStandType.contains(fileType)){ //如果不是制定类型的文件跳转页面, request.setAttribute("fileTypeError","只能上传指定类型的文件,jpg/zip/txt/ppt/pptx/docx/doc/xls/gif"); request.getRequestDispatcher("/handler.jsp").forward(request, response); return ; } //文件已选择,得到输入流 InputStream in=item.getInputStream(); //将上传的文件保存在服务器受保护的WEB-INF的目录下, String savePath=this.getServletContext().getRealPath("WEB-INF/upload"); savePath=getFilePath(savePath,fileName); //同名文件覆盖问题对fileName进行进一步处理,工具类UUID fileName=UUID.randomUUID().toString()+"_"+fileName; //构建输出流 FileOutputStream fos=new FileOutputStream(savePath+"\\"+fileName); byte[] buffer=new byte[1024]; //int len=0; while(in.read(buffer)>0){ fos.write(buffer); fos.flush(); } in.close(); fos.close(); request.setAttribute("finish","上传成功!"); item.delete();//在关闭流之后,删除临时缓存文件 } } } }catch(Exception e){ request.setAttribute("finish","上传失败!"); } request.getRequestDispatcher("/handler.jsp").forward(request, response); } //方法对文件保存目录进行处理, public String getFilePath(String path,String fileName){ //产生目录结构的算法:hash目录 int dir1=fileName.hashCode()&0x0f;//一级目录 int dir2=fileName.hashCode()>>4 &0x0f;//二级目录 String savePath=path+"\\"+dir1+"\\"+"\\"+dir2; File file=new File(savePath); if(!file.exists()){ file.mkdirs(); } return savePath; } public void init() throws ServletException { // Put your code here } }
这样文件上传就实现了。
程序的不足和知识的误点还请各位读者多多交流。
相关文章推荐
- 利用commons-fileupload实现文件的上传(源码)
- 利用commons-fileupload实现文件的上传(源码)
- 在JSP环境中利用Commons-fileupload组件实现文件上传
- 利用 Commons-Fileupload 实现文件上传
- 在JSP环境中利用Commons-fileupload组件实现文件上传
- 利用 Commons-Fileupload 实现文件上传
- 利用commons-fileupload 实现文件上传终极版及commons-fileupload和commons-io包关系
- 利用commons-fileupload在servlet中实现文件上传
- java web 利用 commons-fileupload-1.2 实现文件上传 解决 中文乱码& 非文件属性的读取
- 利用commons-fileupload组件实现文件上传-实例
- java web 利用 commons-fileupload-1.2 实现文件上传 解决 中文乱码& 非文件属性的读取
- java利用commons-fileupload组件实现文件的上传与下载
- 利用commons-fileupload实现文件上传
- 利用commons-fileupload 实现文件上传终极版及commons-fileupload和commons-io包关系
- 利用apache的Commons-fileupload和Ajax实现文件上传进度条
- 利用commons-fileupload实现多个文件上传
- 利用commons-fileupload组件实现文件上传-实例
- 利用commons-fileupload 实现文件上传终极版及commons-fileupload和commons-io包关系
- 利用commons-fileupload实现文件上传
- 利用 Commons-Fileupload 实现文件上传