文件上傳下載:commons-fileupload + Servlet 2.5

數據庫:MySQLjavascript

開發技術:JSP + Servlet 2.5java

第三方的上傳組件:
  commons-fileupload
  connons-io數據庫


上傳頁面
一、form表單須要增長:enctype="multipart/form-data" 以字節流形式
二、form表單裏面增長上傳組件:input="file"
三、取消上傳:<button onclick="javascript:window.opener == null;window.close();">取消上傳</button>apache

<form id="form1" method="post" action="upload" enctype="multipart/form-data">
  <table>
       <tr>
              <td width="25%" align="right">上傳文件:</td>
              <td><input id="file1" type="file" NAME="file1" style="width: 300px;"></td>
          </tr>
          <tr align="center" valign="middle">
              <td height="60" colspan="2">
                 <input type="submit" id="BtnOK" value="確認上傳">
                 <button onclick="javascript:window.opener == null;window.close();">取消上傳</button>
              </td>
           </tr>
           <tr align="center" valign="middle">
               測試非表單控件的值接收:<td height="60" colspan="2"><input type="text" name="possess" value="非提交控件的值"></td>
           </tr>
  </table>
</form>

 

 

代碼:
工具類 MutiFileUpload.java 對fileupload組件進行簡單封裝服務器

import java.io.UnsupportedEncodingException;

import java.util.HashMap;  
import java.util.Iterator;  
import java.util.List;  
import java.util.Map;  
  
import javax.servlet.http.HttpServletRequest;  
  
import org.apache.commons.fileupload.FileItem;  
import org.apache.commons.fileupload.FileUploadException;  
import org.apache.commons.fileupload.disk.DiskFileItemFactory;  
import org.apache.commons.fileupload.servlet.ServletFileUpload;  
  
/**
 * 當讀取上傳表單的各部分時會用到該encoding,若是沒有指定
 * encoding * 則使用系統缺省的encoding。建議在這裏設置成utf-8,並把jsp
 * 的charset也設置成utf-8,不然可能會出現亂碼。
 *
 */
@SuppressWarnings("unchecked")
public class MutiFileUpload{  
  
  public Map<String,String> parameters ;    //保存form表單域中非上傳控件的值
   public Map<String,FileItem> files;      //保存上傳的文件
  
  //將文件保存在內存仍是磁盤臨時文件夾的默認臨界值,值爲10240,即10kb private int sizeThreshold = DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD; private long sizeMax = 1024 * 1024 * 20 ;   //上傳文件的大小限制; private String encoding = "UTF-8";     //字符編碼,當讀取上傳表單的各部分時會用到該encoding
  // 以上屬性的 get/set 方法 public String getEncoding() { return encoding; } public void setEncoding(String encoding) { this.encoding = encoding; } public long getSizeMax() { return sizeMax; } public void setSizeMax(long sizeMax) { this.sizeMax = sizeMax; } public int getSizeThreshold() { return sizeThreshold; } public void setSizeThreshold(int sizeThreshold) { this.sizeThreshold = sizeThreshold; }   
   // 解析請求,這個方法很重要
public void parse(HttpServletRequest request){
     //保存數據的2個Map初始化 parameters
= new HashMap<String,String>(); files = new HashMap<String,FileItem>(); DiskFileItemFactory factory = new DiskFileItemFactory(); //設置臨界值約束 factory.setSizeThreshold(sizeThreshold); ServletFileUpload upload = new ServletFileUpload(factory); upload.setSizeMax(sizeMax); upload.setHeaderEncoding(encoding); try { List items = upload.parseRequest(request); Iterator iterator = items.iterator(); while(iterator.hasNext()){ FileItem item = (FileItem)iterator.next(); if(item.isFormField()){ String fieldName = item.getFieldName(); String value = new String(item.getString(encoding)); parameters.put(fieldName, value); }else{ String fieldName = item.getFieldName(); files.put(fieldName, item); } } } catch (FileUploadException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } /** 獲得上傳文件的文件名 * @param item * @return */ public String getFileName(FileItem item){ String fileName = item.getName(); fileName = replace(fileName,"\\","/"); fileName = fileName.substring(fileName.lastIndexOf("/")+1); return fileName; } /**字符串替換 * @param source * @param oldString * @param newString * @return */ public static String replace(String source, String oldString, String newString) { StringBuffer output = new StringBuffer(); int lengthOfSource = source.length(); int lengthOfOld = oldString.length(); int posStart = 0; int pos; while ((pos = source.indexOf(oldString, posStart)) >= 0) { output.append(source.substring(posStart, pos)); output.append(newString); posStart = pos + lengthOfOld; } if (posStart < lengthOfSource) { output.append(source.substring(posStart)); } return output.toString(); } }

 上傳Servlet,doGet方法請求doPost。在doPost方法中編寫以下代碼:app

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        DBUtils db = new DBUtils();
        
        
        MutiFileUpload fileUpload = new MutiFileUpload();
        fileUpload.parse(request);
        
     //這裏是打印非上傳組件的值,查看是否可以正常接收
//System.out.println( fileUpload.parameters.get("possess") ); Iterator<FileItem> iterator = fileUpload.files.values().iterator(); while(iterator.hasNext()){ FileItem item = iterator.next();    String fileName = fileUpload.getFileName(item); if( fileName != null && !fileName.equals("")){ //獲取服務器的路徑 String serverPath = request.getSession().getServletContext().getRealPath("");    //對上傳文件從新命名 String rename = getReName(fileName); File file = new File( serverPath+"/upload/"+rename); try {
if( !file.isDirectory()){
//上傳成功後作數據庫操做
 item.write(file); //數據庫操做,這裏沒有考慮效率,若是是多文件上傳,能夠考慮SQL的批處理
                        db.saveOrUpdateOrDel("insert into uploadfile(realname,rename_) values(?,?)", new Object[]{fileName ,rename }); } } catch (Exception e) { e.printStackTrace(); //將上傳的文件刪除
                    if( file.exists()) file.delete(); } } } } /** * 以服務器當前時間爲爲上傳文件從新命名 * @param fileName * @return 新文件名 */
    private String getReName(String fileName){ int begin = fileName.lastIndexOf("."); String extend = fileName.substring(begin, fileName.length()); return System.currentTimeMillis() + extend; }

 

顯示文件下載列表Servlet ,實體類就再也不發了,能夠在最下面按照SQL語句寫jsp

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        DBUtils db = new DBUtils();
        List<UploadFile> ufs = db.queryForObject("select * from uploadfile", null, UploadFile.class);
        request.setAttribute("filelist", ufs);
        request.getRequestDispatcher("filelist.jsp").forward(request,response);
    }

 

顯示文件下載列表頁面工具

╮(╯▽╰)╭  循環部分發出來就好了,這個filelist.jsp頁面原本就這麼一點東西post

<c:forEach items="${filelist}" var="uf">
      ${uf.realname }&nbsp;&nbsp;&nbsp;<a href="down?re=${uf.rename_}&real=${uf.realname}">下載</a><br>
</c:forEach>

 

 文件下載Servlet測試

public void doPost(HttpServletRequest request, HttpServletResponse response)  
            throws ServletException, IOException {  
        
        //獲取下載文件的名字
        String re = request.getParameter("re");
        //獲取下載文件的真實名字
        String real = request.getParameter("real");
        
        //獲取服務器路徑
        String serverPath = request.getSession().getServletContext().getRealPath("");
        File f = new File( serverPath+"/upload/"+re);
        
        if(    f.exists()    ){  
            FileInputStream  fis = new FileInputStream(f);  
            //手動轉碼,示例中是GET請求,要麼手動轉碼,要麼在過濾器中進行GET請求處理,固然能在服務器直接配置get請求編碼就一勞永逸了
            String filename = new String(real.getBytes("ISO8859-1"),"UTF-8");
            byte[] b = new byte[fis.available()];  
            fis.read(b);  
            response.setCharacterEncoding("UTF-8");  
            response.setHeader("Content-Disposition","attachment; filename="+filename );  
            //獲取響應報文輸出流對象  
            ServletOutputStream  out =response.getOutputStream();  
            out.write(b);  
            out.flush();  
            out.close();  
        }     
          
    }  

 

MySQL 數據庫部分

 

SET NAMES utf8;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
--  Table structure for `uploadfile`
-- ----------------------------
DROP TABLE IF EXISTS `uploadfile`;
CREATE TABLE `uploadfile` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `realname` varchar(255) NOT NULL COMMENT '上傳前的文件名字',
  `rename_` varchar(255) NOT NULL COMMENT '從新命名',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;

SET FOREIGN_KEY_CHECKS = 1;
相關文章
相關標籤/搜索