利用commons-fileupload实现文件的上传(源码)
来源:互联网 发布:淘宝已评价管理在哪里 编辑:程序博客网 时间:2024/05/18 00:56
现在我们利用commons-fileupload实现文件的上传,
开发环境: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的源码:
- <span style="white-space:pre"> </span>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);
- }
指定了编码"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
- }
0 0
- 利用commons-fileupload实现文件的上传(源码)
- 利用commons-fileupload实现文件的上传(源码)
- 利用commons-fileupload实现文件的上传(源码)
- 利用commons-fileupload实现文件上传
- Servlet利用Commons FileUpload实现文件上传
- 利用commons-fileupload实现文件上传
- 利用 Commons-Fileupload 实现文件上传
- 利用 Commons-Fileupload 实现文件上传
- 利用 Commons-Fileupload 实现文件上传
- 利用commons-fileupload 实现文件上传终极版及commons-fileupload和commons-io包关系
- 利用commons-fileupload 实现文件上传终极版及commons-fileupload和commons-io包关系
- 利用commons-fileupload 实现文件上传终极版及commons-fileupload和commons-io包关系
- 使用commons-fileupload实现文件的上传
- commons-fileupload 实现文件上传
- Commons-Fileupload 实现文件上传
- Commons-FileUpload实现文件上传
- commons-fileupload实现文件上传
- 利用Jakarta commons fileupload组件实现多文件上传
- 初学Android,图形图像之使用Path类
- destoon系统中tag如何使用like与%来进行模糊查询
- HDU-#1102 Constructing Roads(Prim & Kruskal)
- 矩阵旋转(图像旋转)
- 计算机网络学习--ip首部学习
- 利用commons-fileupload实现文件的上传(源码)
- socket选项_总结
- collection接口详解
- ARM MMU工作原理剖析
- 大神博客
- HDU2825 Wireless Password AC自动机
- jar包查找地址http://www.findjar.com
- Kendo UI 2014.2支持Angular
- JAVA中的format