1. 程式人生 > >從HttpServletRequest中讀取檔案內容

從HttpServletRequest中讀取檔案內容

這裡介紹如何利用表單來將檔案傳輸到伺服器。

首先我們的前臺jsp頁面的原始碼如下

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content
="text/html; charset=UTF-8">
<title>上傳檔案</title> </head> <body> <form action="file/fileUpload" enctype="multipart/form-data" method="post"> <input type="file" name="fileUploader" multiple /><br /> <br /> <input type="submit" value
="上傳檔案" />
</form> </body> </html>

web.xml中的配置如下

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee" id="WebApp_ID" version="2.5">

    <!--配置servlet -->

    <servlet>
<servlet-name>FileUploadController</servlet-name> <servlet-class>com.blog.upload.FileUploadController </servlet-class> </servlet> <servlet-mapping> <servlet-name>FileUploadController</servlet-name> <url-pattern>/file/fileUpload</url-pattern> </servlet-mapping> </web-app>

接下來就是我們後臺的程式碼了
在這裡我將從HttpServletRequest中讀取檔案的方法封裝成一個靜態的方法,放在FilEUploadUtils.getFileContentFromRequest()

則控制器的程式碼如下

package com.blog.upload;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class FileUploadController extends HttpServlet {

    private static final long serialVersionUID = 1L;

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        String content=FilEUploadUtils.getFileContentFromRequest(request);  //獲取檔案的內容
        System.out.println(content);                                        //輸出檔案的內容
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
    }

}

靜態方法getFileContentFromRequest中的程式碼如下

package com.blog.upload;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import javax.servlet.http.HttpServletRequest;

import org.apache.tomcat.util.http.fileupload.FileItemIterator;
import org.apache.tomcat.util.http.fileupload.FileItemStream;
import org.apache.tomcat.util.http.fileupload.disk.DiskFileItemFactory;
import org.apache.tomcat.util.http.fileupload.servlet.ServletFileUpload;

public class FilEUploadUtils {


    public static String getFileContentFromRequest(HttpServletRequest request){

         try{
            request.setCharacterEncoding("utf-8");
            if(ServletFileUpload.isMultipartContent(request)) {
                DiskFileItemFactory diskFileItemFactory=new DiskFileItemFactory();// 建立該物件
                ServletFileUpload fileUpload=new ServletFileUpload(diskFileItemFactory);// 建立該物件
                FileItemIterator itemIterator=fileUpload.getItemIterator(request);// 解析request 請求,並返回FileItemIterator集合
                StringBuffer fileContent=new StringBuffer();
                while(itemIterator.hasNext()) {
                    FileItemStream itemStream=itemIterator.next();//從集合中獲得一個檔案流
                    if(!itemStream.isFormField() && itemStream.getName().length() > 0) {    //過濾掉表單中非檔案
                        BufferedInputStream inputStream=new BufferedInputStream(itemStream.openStream());   //獲得檔案輸入流
                        inputStream.mark(itemStream.openStream().available()+1);
                        //判斷上傳的檔案的編碼格式 支援 UTF-8 和 ANSI兩種型別
                        String charsetName=getFileCharsetName(inputStream);

                        BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream,charsetName));
                        String lineTxt=null;
                        while((lineTxt=bufferedReader.readLine()) != null) {
                            fileContent.append(lineTxt+"\r");
                        }

                    }
                }
                return fileContent.toString();
            }
        } catch(Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    //判斷上傳的檔案的編碼格式 支援 UTF-8 和 ANSI兩種型別
    private static String getFileCharsetName(InputStream inputStream) throws IOException{
        String charsetName="GBK";
        byte[] typeByte = new byte[3];

        inputStream.read(typeByte);
        if (typeByte[0] == -17 && typeByte[1] == -69 && typeByte[2] == -65){
            charsetName="UTF-8";
        }
        else{
            charsetName="GBK";
        }
        inputStream.reset();
        return charsetName;
    }

}