COS这个文件上传组件可以说在几个开源的上传文件组件中性能是非常优秀的,上传速度很快(相比fileUpload,smart等组件),但在使用Struts2结合COS文件上传时要注意Struts2实现了自己的MultiPartRequest,这个过滤后的request是不认COS的。
/** * CosTest * 去上传文件页面 */ package com.labci.upload.file.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.labci.upload.file.util.FileUtils; /** * @author Bill Tu(tujiyue/iwtxokhtd) * Jun 4, 2011[10:15:38 PM] * */ public class ToUploadFileServlet extends HttpServlet { /** * */ private static final long serialVersionUID = -5958936751236640280L; @SuppressWarnings("deprecation") @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String savePath=getInitParameter("path"); String fullPath=req.getRealPath(savePath); String allFileNames=FileUtils.getAllFileNames(fullPath); req.setAttribute("allFileNames", allFileNames); req.getRequestDispatcher(getInitParameter("page")).forward(req, resp); } }
/** * CosTest * 使用COS实现文件上传的Servlet */ package com.labci.upload.file.servlet; import java.io.File; import java.io.IOException; import java.util.Enumeration; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.labci.upload.file.util.CustomFileRenamePolicy; import com.labci.upload.file.util.FileUtils; import com.oreilly.servlet.MultipartRequest; import com.oreilly.servlet.multipart.DefaultFileRenamePolicy; /** * @author Bill Tu(tujiyue/iwtxokhtd) * Jun 4, 2011[10:29:58 PM] * */ public class UploadFileServlet extends HttpServlet { /** * */ private static final long serialVersionUID = 2006618974553985487L; //默认值 private static int FILE_MAX_SIZE=1024; private static String savePath="/upload"; private static String targetPage="index.jsp"; private static String encoding="gbk"; @Override public void init() throws ServletException { FILE_MAX_SIZE=Integer.parseInt(getInitParameter("max")); savePath=getInitParameter("path"); targetPage=getInitParameter("page"); encoding=getInitParameter("encode"); } @SuppressWarnings({ "deprecation", "unchecked" }) @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String fullPath=req.getRealPath(savePath); File dir=new File(fullPath); if(!dir.exists()){ dir.mkdirs(); } /** * 1.不使用文件命名策略的情况下,上传相同的文件会进行覆盖,只保留一份 * 2.使用默认的文件命名策略的情况下,上传相同的文件会在文件名后加1.2.3等数字系列号 * 3.可实现FileRenamePolicy接口使用自己的文件命名策略 */ // DefaultFileRenamePolicy defaultPolicy=new DefaultFileRenamePolicy(); CustomFileRenamePolicy customPolicy=new CustomFileRenamePolicy(); @SuppressWarnings("unused") MultipartRequest mpr=new MultipartRequest(req,fullPath,FILE_MAX_SIZE,encoding,customPolicy); Enumeration fileNames=mpr.getFileNames();//得到所有已上传的文件名 while(fileNames.hasMoreElements()){ String fileName=(String) fileNames.nextElement(); System.out.println(mpr.getFilesystemName(fileName));//得到该文件的现上传后的文件名 System.out.println(mpr.getOriginalFileName(fileName));//得到该文件上传前的文件名(即原始名) } String allFileNames=FileUtils.getAllFileNames(fullPath); req.setAttribute("allFileNames", allFileNames); req.getRequestDispatcher(targetPage).forward(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req,resp); } }
/** * CosTest * 定义自己的文件重命名策略 */ package com.labci.upload.file.util; import java.io.File; import com.oreilly.servlet.multipart.FileRenamePolicy; /** * @author Bill Tu(tujiyue/iwtxokhtd) * Jun 4, 2011[10:58:09 PM] * */ public class CustomFileRenamePolicy implements FileRenamePolicy { public File rename(File file) { //假如就按时间戳来命名吧 long time=System.currentTimeMillis(); int lastDotPos=file.getName().lastIndexOf("."); String bodyName=file.getName().substring(0,lastDotPos); if(lastDotPos != -1){ //有后缀名 return new File(file.getParent(),bodyName+time+file.getName().substring(lastDotPos)); }else{ return new File(file.getParent(),bodyName+time); } } }
/** * CosTest * 上传文件所用到的工具类 */ package com.labci.upload.file.util; import java.io.File; /** * @author Bill Tu(tujiyue/iwtxokhtd) * Jun 4, 2011[4:15:11 PM] * */ public class FileUtils { private FileUtils(){ } /** * 得到所有的文件名 * @param dirPath * @return */ public static String getAllFileNames(String dirPath){ StringBuilder fileNames=new StringBuilder(""); File files=new File(dirPath); if(files.isDirectory()){ File []allFiles=files.listFiles(); if(null!=allFiles && allFiles.length>0){ for(File f:allFiles){ if(f.isFile()){ fileNames.append(f.getName()).append(","); } } fileNames.deleteCharAt(fileNames.length()-1); } } return fileNames.toString(); } }
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <servlet> <servlet-name>toUploadFilePage</servlet-name> <servlet-class>com.labci.upload.file.servlet.ToUploadFileServlet</servlet-class> <init-param> <param-name>page</param-name> <param-value>uploadFile.jsp</param-value> </init-param> <init-param> <param-name>path</param-name> <param-value>/upload</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>toUploadFilePage</servlet-name> <url-pattern>/toUploadFilePage</url-pattern> </servlet-mapping> <servlet> <servlet-name>uploadFile</servlet-name> <servlet-class>com.labci.upload.file.servlet.UploadFileServlet</servlet-class> <init-param> <param-name>page</param-name> <param-value>uploadFile.jsp</param-value> </init-param> <init-param> <param-name>path</param-name> <param-value>/upload</param-value> </init-param> <init-param> <param-name>max</param-name> <param-value>104857600</param-value> </init-param> <init-param> <param-name>encode</param-name> <param-value>utf-8</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>uploadFile</servlet-name> <url-pattern>/uploadFile</url-pattern> </servlet-mapping> </web-app>
<%@ page language="java" contentType="text/html;charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>使用COS上传文件示例</title> </head> <body> <a href="toUploadFilePage" mce_href="toUploadFilePage">使用COS上传文件</a> </body> </html>
<%@ page language="java" contentType="text/html;charset=utf-8" pageEncoding="utf-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>上传文件</title> </head> <body> <table> <tr> <td> <c:choose> <c:when test="${empty allFileNames}"> <font color="blue">暂无上传的文件,请上传!</font> </c:when> <c:otherwise> <font color="red"><b>${allFileNames}</b></font> </c:otherwise> </c:choose> </td> </tr> <%--COS组件支持同时上传多个文件,不需要在上传代码中取文件名、大小等--%> <tr> <td> <form action="uploadFile" method="post" enctype="multipart/form-data"> <p> <input type="file" name="file1"/> </p> <p> <input type="file" name="file2"/> </p> <p> <input type="submit" value="上传"/> </p> </form> </td> </tr> </table> </body> </html>
COS相比其它上传文件组件而言,除了具有速度优势外,其使用的便携性是非常好的,一两句简单地代码就搞定了COS对多文件的上传(指定下保存的地址、总文件上传大小限制、文件重命名策略[可选]、编码等),不像fileUpload,smart,Struts2等上传文件时那么麻烦。
工程结构图:
代码:
- /**
- * CosTest
- * 去上传文件页面
- */
- package com.labci.upload.file.servlet;
- import java.io.IOException;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import com.labci.upload.file.util.FileUtils;
- /**
- * @author Bill Tu(tujiyue/iwtxokhtd)
- * Jun 4, 2011[10:15:38 PM]
- *
- */
- public class ToUploadFileServlet extends HttpServlet {
- /**
- *
- */
- private static final long serialVersionUID = -5958936751236640280L;
- @SuppressWarnings("deprecation")
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- String savePath=getInitParameter("path");
- String fullPath=req.getRealPath(savePath);
- String allFileNames=FileUtils.getAllFileNames(fullPath);
- req.setAttribute("allFileNames", allFileNames);
- req.getRequestDispatcher(getInitParameter("page")).forward(req, resp);
- }
- }
- /**
- * CosTest
- * 使用COS实现文件上传的Servlet
- */
- package com.labci.upload.file.servlet;
- import java.io.File;
- import java.io.IOException;
- import java.util.Enumeration;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import com.labci.upload.file.util.CustomFileRenamePolicy;
- import com.labci.upload.file.util.FileUtils;
- import com.oreilly.servlet.MultipartRequest;
- import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;
- /**
- * @author Bill Tu(tujiyue/iwtxokhtd)
- * Jun 4, 2011[10:29:58 PM]
- *
- */
- public class UploadFileServlet extends HttpServlet {
- /**
- *
- */
- private static final long serialVersionUID = 2006618974553985487L;
- //默认值
- private static int FILE_MAX_SIZE=1024;
- private static String savePath="/upload";
- private static String targetPage="index.jsp";
- private static String encoding="gbk";
- @Override
- public void init() throws ServletException {
- FILE_MAX_SIZE=Integer.parseInt(getInitParameter("max"));
- savePath=getInitParameter("path");
- targetPage=getInitParameter("page");
- encoding=getInitParameter("encode");
- }
- @SuppressWarnings({ "deprecation", "unchecked" })
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- String fullPath=req.getRealPath(savePath);
- File dir=new File(fullPath);
- if(!dir.exists()){
- dir.mkdirs();
- }
- /**
- * 1.不使用文件命名策略的情况下,上传相同的文件会进行覆盖,只保留一份
- * 2.使用默认的文件命名策略的情况下,上传相同的文件会在文件名后加1.2.3等数字系列号
- * 3.可实现FileRenamePolicy接口使用自己的文件命名策略
- */
- // DefaultFileRenamePolicy defaultPolicy=new DefaultFileRenamePolicy();
- CustomFileRenamePolicy customPolicy=new CustomFileRenamePolicy();
- @SuppressWarnings("unused")
- MultipartRequest mpr=new MultipartRequest(req,fullPath,FILE_MAX_SIZE,encoding,customPolicy);
- Enumeration fileNames=mpr.getFileNames();//得到所有已上传的文件名
- while(fileNames.hasMoreElements()){
- String fileName=(String) fileNames.nextElement();
- System.out.println(mpr.getFilesystemName(fileName));//得到该文件的现上传后的文件名
- System.out.println(mpr.getOriginalFileName(fileName));//得到该文件上传前的文件名(即原始名)
- }
- String allFileNames=FileUtils.getAllFileNames(fullPath);
- req.setAttribute("allFileNames", allFileNames);
- req.getRequestDispatcher(targetPage).forward(req, resp);
- }
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- doGet(req,resp);
- }
- }
- /**
- * CosTest
- * 定义自己的文件重命名策略
- */
- package com.labci.upload.file.util;
- import java.io.File;
- import com.oreilly.servlet.multipart.FileRenamePolicy;
- /**
- * @author Bill Tu(tujiyue/iwtxokhtd)
- * Jun 4, 2011[10:58:09 PM]
- *
- */
- public class CustomFileRenamePolicy implements FileRenamePolicy {
- public File rename(File file) {
- //假如就按时间戳来命名吧
- long time=System.currentTimeMillis();
- int lastDotPos=file.getName().lastIndexOf(".");
- String bodyName=file.getName().substring(0,lastDotPos);
- if(lastDotPos != -1){
- //有后缀名
- return new File(file.getParent(),bodyName+time+file.getName().substring(lastDotPos));
- }else{
- return new File(file.getParent(),bodyName+time);
- }
- }
- }
- /**
- * CosTest
- * 上传文件所用到的工具类
- */
- package com.labci.upload.file.util;
- import java.io.File;
- /**
- * @author Bill Tu(tujiyue/iwtxokhtd)
- * Jun 4, 2011[4:15:11 PM]
- *
- */
- public class FileUtils {
- private FileUtils(){
- }
- /**
- * 得到所有的文件名
- * @param dirPath
- * @return
- */
- public static String getAllFileNames(String dirPath){
- StringBuilder fileNames=new StringBuilder("");
- File files=new File(dirPath);
- if(files.isDirectory()){
- File []allFiles=files.listFiles();
- if(null!=allFiles && allFiles.length>0){
- for(File f:allFiles){
- if(f.isFile()){
- fileNames.append(f.getName()).append(",");
- }
- }
- fileNames.deleteCharAt(fileNames.length()-1);
- }
- }
- return fileNames.toString();
- }
- }
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app version="2.4"
- xmlns="http://java.sun.com/xml/ns/j2ee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
- http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
- <servlet>
- <servlet-name>toUploadFilePage</servlet-name>
- <servlet-class>com.labci.upload.file.servlet.ToUploadFileServlet</servlet-class>
- <init-param>
- <param-name>page</param-name>
- <param-value>uploadFile.jsp</param-value>
- </init-param>
- <init-param>
- <param-name>path</param-name>
- <param-value>/upload</param-value>
- </init-param>
- </servlet>
- <servlet-mapping>
- <servlet-name>toUploadFilePage</servlet-name>
- <url-pattern>/toUploadFilePage</url-pattern>
- </servlet-mapping>
- <servlet>
- <servlet-name>uploadFile</servlet-name>
- <servlet-class>com.labci.upload.file.servlet.UploadFileServlet</servlet-class>
- <init-param>
- <param-name>page</param-name>
- <param-value>uploadFile.jsp</param-value>
- </init-param>
- <init-param>
- <param-name>path</param-name>
- <param-value>/upload</param-value>
- </init-param>
- <init-param>
- <param-name>max</param-name>
- <param-value>104857600</param-value>
- </init-param>
- <init-param>
- <param-name>encode</param-name>
- <param-value>utf-8</param-value>
- </init-param>
- </servlet>
- <servlet-mapping>
- <servlet-name>uploadFile</servlet-name>
- <url-pattern>/uploadFile</url-pattern>
- </servlet-mapping>
- </web-app>
- <%@ page language="java" contentType="text/html;charset=utf-8" pageEncoding="utf-8"%>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>使用COS上传文件示例</title>
- </head>
- <body>
- <a href="toUploadFilePage" mce_href="toUploadFilePage">使用COS上传文件</a>
- </body>
- </html>
- <%@ page language="java" contentType="text/html;charset=utf-8" pageEncoding="utf-8"%>
- <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>上传文件</title>
- </head>
- <body>
- <table>
- <tr>
- <td>
- <c:choose>
- <c:when test="${empty allFileNames}">
- <font color="blue">暂无上传的文件,请上传!</font>
- </c:when>
- <c:otherwise>
- <font color="red"><b>${allFileNames}</b></font>
- </c:otherwise>
- </c:choose>
- </td>
- </tr>
- <%--COS组件支持同时上传多个文件,不需要在上传代码中取文件名、大小等--%>
- <tr>
- <td>
- <form action="uploadFile" method="post" enctype="multipart/form-data">
- <p>
- <input type="file" name="file1"/>
- </p>
- <p>
- <input type="file" name="file2"/>
- </p>
- <p>
- <input type="submit" value="上传"/>
- </p>
- </form>
- </td>
- </tr>
- </table>
- </body>
- </html>
示例效果图:
1.首页面:
2.未使用任何重命名策略情况下上传相同文件时的情况: