處理文件上傳或下載公用類

在項目中封裝了個處理文件上傳或者下載的公用類,先分享下。之後還能夠用的到。 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();
        }
    }
}
相關文章
相關標籤/搜索