傳智播客bbs項目,發表主題附件的上傳與下載

      今天繼續學習bbs項目,湯老師添加了發表主題附件的上傳與下載,並對其實現進行了講解。實現的時候要注意數據庫的字符集編碼以及上傳下載的字符集編碼
湯老師先講解了上傳文件遇到的幾個問題:
1,上傳同名的文件, 則後上傳文件的會覆蓋已經上傳的同名文件,要避免服務器端保存文件的同名。 且中文文件名的顯示問題。
2,一個目錄下放了很多文件, 則打開的速度就會很慢, 應分類存放,沒個文件用日期生成文件上傳的當天目錄。
3,文件路徑問題, 應使用相對路徑。
4,控制文件的大小, 超過限制的不能上傳,以免填滿服務器。
文件上傳使用struts中的FormFile 接口,
org.apache.struts.upload.FormFile  formfile 用於 file upload它是一個接口 代表一個從客戶端上傳的文件,它是upload包中唯一的struts應用程序可以直接引用的接口。
主要方法
void destroy()
           銷燬上傳文件的所有內容
 java.lang.String getContentType()
         獲得上傳文件的字符集編碼類型
 byte[] getFileData()
    以字節數組的形式返回整個文件的數據
java.lang.String getFileName() 
          返回文件的文件名
 int getFileSize()
         返回文件的大小
 java.io.InputStream getInputStream()
         返回文件的字節輸入流
 void setContentType(java.lang.String contentType)
         設置上傳文件的字符集編碼類型
 void setFileName(java.lang.String fileName)
         設置文件的名字
 void setFileSize(int fileSize)
         設置文件的大小
編寫saveFile方法 把上傳文件保存到服務器。
public static String saveFile(HttpServletRequest request, FormFile file) {
  //用當天日期設置文件路徑
  SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd/");
  String path = sdf.format(new Date());
  String storePath = request.getSession().getServletContext().getRealPath("/upload") + File.separator
    + path;
  // 如果文件夾不存在,就遞歸的創建
  if (!new File(storePath).exists()) {
   new File(storePath).mkdirs();
  }
  //使用UUID類 確保保存的文件名的唯一
  String uuidFilename = UUID.randomUUID().toString();
  path += uuidFilename;
  //設置上傳文件在服務器應用程序中的路徑
  storePath += uuidFilename;

  FileOutputStream out = null;
  try {
   out = new FileOutputStream(storePath);
   out.write(file.getFileData());
  } catch (Exception e) {
   throw new RuntimeException(e);
  } finally {
   try {
    out.close();
   } catch (Exception e) {
    e.printStackTrace();
   }
  }
  return path;
 }
開始沒有創建upload目錄,拋出了異常java.io.FileNotFoundException,這是因爲FileOutputStream輸出文件到指定文件路徑,如果沒有這個路徑,FileOutputStream不會創建,它只能創建文件。


文件下載
  1. 設置contentType爲application/x-msdownload
 2.Header: Content-Disposition=attachment;filename=xxx.yy
3 .讀取文件的路徑要設置好,不然找不到要下載的文件,拋出異常。
public ActionForward download(ActionMapping mapping, ActionForm form, HttpServletRequest request,
   HttpServletResponse response) throws Exception {
  int id =RequestParameterUtil.getInt(request, "id", 0);
  Attachment attachment=attachmentService.getAttachment(id);
  if(attachment==null){
   return null;
  }
  //對文件名進行URL編碼
  String fileName=URLEncoder.encode(attachment.getFilename(), "utf-8");
  response.setContentType("application/x-msdownload");
  response.addHeader("Content-Disposition", "attachment;filename="+fileName);
  
  String path=request.getSession().getServletContext().getRealPath("/")+"/upload/"+attachment.getPath();
  FileInputStream in=null;
  try{
  in=new FileInputStream(path);
  OutputStream out=response.getOutputStream();
  
  byte [] buf=new byte[4096];
  for(int len=-1;(len=in.read(buf))!=-1;){
   out.write(buf, 0, len);
  }
  out.flush();
  }finally{
   if(in!=null)
        in.close();
  }

  return null;
 }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章