在項目中封裝了個處理文件上傳或者下載的公用類,先分享下。之後還能夠用的到。 html
package com.conmon.util; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.URLEncoder; import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.upload.FormFile; public class FileUtil { /** 獲取文件擴展名(包含".") * * @param fileName * @return */ public static String getFileExtension(String fileName) { // 獲取擴展名 String extension = fileName.substring(fileName.indexOf(".")); return extension; } /** 獲取更名後的文件名 * * @param fileName * @return */ public static String createSaveFileName(String fileName) { // 獲取擴展名 String extension = fileName.substring(fileName.indexOf(".")); return System.currentTimeMillis() + extension; } /** 判斷目錄是否存在(不存在則建立) * * @param dir */ public static void directoryExists(String dir) { // 保存目錄 File saveDirectory = new File(dir); // 若是不存在則建立 if (!saveDirectory.exists()) { saveDirectory.mkdir(); } } /** Struts 上傳文件 (注:此方法很差,每次都讀入8m到內存中,很耗資源,性能很差) * * @param file * @param filePath */ public static void uploadFile(FormFile file, String filePath) { InputStream streamIn; OutputStream streamOut; try { streamIn = file.getInputStream(); streamOut = new FileOutputStream(filePath); int bytesRead = 0; byte[] buffer = new byte[8192]; while ((bytesRead = streamIn.read(buffer, 0, 8192)) != -1) { streamOut.write(buffer, 0, bytesRead); } streamOut.close(); streamIn.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** Struts 上傳文件 (注:對比uploadFile方法性能上比較好,運用了緩衝流) * * @param file * @param filePath */ public static void uploadFile2(FormFile file, String filePath) { // 取得二進制輸入流 InputStream sis; try { sis = file.getInputStream(); // 與輸入緩衝流接上 BufferedInputStream bis = new BufferedInputStream(sis); // 文件輸出流 FileOutputStream fos = new FileOutputStream(filePath); // 緩衝輸出流 BufferedOutputStream bos = new BufferedOutputStream(fos); // 每次從輸入流中讀入的數據都放置到這個數組中 byte[] buffer = new byte[1024]; int len = -1; while ((len = bis.read(buffer)) != -1) { // 輸出讀入的數據 bos.write(buffer, 0, len); } // 關閉流 bos.close(); fos.close(); bis.close(); sis.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** Struts 上傳文件 * * @param file * @param filePath */ public static void uploadFile3(FormFile file, String filePath) { // File f1 = new File(""); File f2 = new File(filePath); try { byte[] bytes = file.getFileData(); // 字符輸入流 // FileReader fr = new FileReader(f1); // BufferedReader br = new BufferedReader(fr); // 字符輸出流 FileWriter fw = new FileWriter(f2); BufferedWriter bw = new BufferedWriter(fw); String s2 = new String(bytes, "utf-8"); bw.write(s2); /* * String s; while((s=br.readLine())!= null){ bw.write(s); } */ bw.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** 建立下載文件名 * * @param userId * @return */ public static String createFileName(Long userId) { // 獲取擴展名 return userId + System.currentTimeMillis() + ".htm"; } /** 建立文件 並將內容寫入文件 * * @param file * @param content */ public static void createFile(File file, String content) { try { if (file.exists()) { file.delete(); file.createNewFile(); // 將內容寫入文件 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file)); bos.write(content.getBytes()); bos.flush(); bos.close(); } else { file.createNewFile(); // 將內容寫入文件 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file)); bos.write(content.getBytes()); bos.flush(); bos.close(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** 建立文件 並將內容寫入文件(並轉成utf-8的編碼格式,不知道爲什麼轉碼失效,明明就是用的是字符流,想了好久和調試了好久仍是不行。) * * @author * @param file * @param content */ public static void writeUTFFile(File file, String content) { FileOutputStream fos = null; OutputStreamWriter osw = null; PrintWriter outFile = null; try { if (file.exists()) { file.delete(); file.createNewFile(); // 將內容寫入文件 fos = new FileOutputStream(file); osw = new OutputStreamWriter(fos, "UTF-8"); // 這裏能夠生成編碼是utf-8的html的文件 outFile = new PrintWriter(osw); // 問題出在這裏。 outFile.write(content); osw.flush(); osw.close(); fos.flush(); fos.close(); } else { file.createNewFile(); // 將內容寫入文件 fos = new FileOutputStream(file); osw = new OutputStreamWriter(fos, "UTF-8"); // 字節流和字符流的橋樑,能夠指定指定字符編碼格式 outFile = new PrintWriter(osw); outFile.write(content); osw.flush(); osw.close(); fos.flush(); fos.close(); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** 生成UTF-8文件.(重載上面的方法) 若是文件內容中沒有中文內容,則生成的文件爲ANSI編碼格式; 若是文件內容中有中文內容,則生成的文件爲UTF-8編碼格式。 * * @author * @param fileName * 待生成的文件名(含完整路徑) * @param fileBody * 文件內容 * @return */ public static boolean writeUTFFile(String fileName, String content) { FileOutputStream fos = null; OutputStreamWriter osw = null; try { fos = new FileOutputStream(fileName); // 文件字節流 osw = new OutputStreamWriter(fos, "UTF-8"); // 字節流和字符流的橋樑,能夠指定指定字符編碼格式 osw.write(content); return true; } catch (Exception e) { e.printStackTrace(); return false; } finally { if (osw != null) { try { osw.close(); } catch (IOException e1) { e1.printStackTrace(); } } if (fos != null) { try { fos.close(); } catch (IOException e1) { e1.printStackTrace(); } } } } /** 下載文件 * * @param filepath * @param filename * @param response */ public static void downloadFile(String filepath, String filename, HttpServletResponse response) { BufferedInputStream bis = null; BufferedOutputStream bos = null; OutputStream fos = null; InputStream fis = null; // 若是是從服務器上取就用這個得到系統的絕對路徑方法。 String filepath = // servlet.getServletContext().getRealPath("/" + path); File uploadFile = new File(filepath); try { fis = new FileInputStream(uploadFile); bis = new BufferedInputStream(fis); fos = response.getOutputStream(); bos = new BufferedOutputStream(fos); // 這個就就是彈出下載對話框的關鍵代碼 response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(filename, "utf-8")); int bytesRead = 0; // 這個地方的同上傳的同樣。我就很少說了,都是用輸入流進行先讀,而後用輸出流去寫,惟一不一樣的是我用的是緩衝輸入輸出流 byte[] buffer = new byte[8192]; while ((bytesRead = bis.read(buffer, 0, 8192)) != -1) { bos.write(buffer, 0, bytesRead); } bos.flush(); fis.close(); bis.close(); fos.close(); bos.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }