java之struts2之文件上傳


1.在大多數應用中,都有文件上傳功能。有兩種文件上傳的方式,一種是自己去解析http協議,獲取文件上傳的內容。另一種是通過第三方插件來實現文件上傳。第三方插件一般有兩種,smartfileupload(上傳小文件效率比較好,沒有更新),commons-fileupload

2.在servlet中實現文件上傳的步驟

  a) 導入jar包 commons-fileupload, common-io

  b) 編寫jsp 頁面,表單提交必須是 post ,enctype="multipart/form-data"

<body>
    <form action="fileupload" method="post" enctype="multipart/form-data">
    用戶名:<input type="text" name="name"/><br>
    文件:<input type="file" name="file"/><input type="submit" value="上傳"/>
    </form>
</body

  c) 編寫servlet 

@WebServlet("/fileupload") public class FileUploadServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //上傳文件存放位置
        String path = req.getServletContext().getRealPath("/upload");
        //創建磁盤目錄工廠  該工廠可以設置 臨時文件大小,還可以設置臨時目錄
        DiskFileItemFactory df = new DiskFileItemFactory();
        //將目錄綁定ServletFileUpload 類  這個類完成http協議的解析
        ServletFileUpload upload=new ServletFileUpload(df);
        try {
            //解析req  返回所有表單項目目錄
            List<FileItem> list = upload.parseRequest(req);
            for(FileItem item:list){
                if(item.isFormField()){//正常表單項
                    String name=item.getFieldName();
                    String value=item.getString();
                    System.out.println(name+"======"+value);
                }else{//文件上傳項
                    String name=item.getName();
                    InputStream is = item.getInputStream();
                    OutputStream os = new FileOutputStream(new File(path,name));
                    byte[] buffer = new byte[400];
                    int len=0;
                    while((len=is.read(buffer))!=-1)
                        os.write(buffer, 0, len);
                    os.close();
                    is.close();
                }
            }
            
        } catch (FileUploadException e) {
            e.printStackTrace();
        }
    }
}

3. Struts2中已經將文件上傳功能封裝好了,不需要再像servlet一樣,分別來自己編碼實現。

實現步驟

  a) 編寫 jsp 頁面和 servlet 編寫方式一樣

<form action="upload.action" method="post" enctype="multipart/form-data">
    文件:<input type="file" name="file"/><input type="submit" value="上傳"/>
    </form>

  b) 編寫處理上傳文件的 Action

public class UploadAction {
    //File的名稱和表單域中的名稱相同
    private File file;
    //獲取文件名  文件名屬性 必須是  表單域名+FileName;
    private String fileFileName;
    //獲取文件的類型
    private String fileContentType;
    //上傳的處理方法
    public String upload(){
        String path=ServletActionContext.getServletContext().getRealPath("/upload");
        try {
            FileUtils.copyFile(file, new File(path,fileFileName));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return Action.SUCCESS;
    }
    
    public File getFile() {
        return file;
    }
    public void setFile(File file) {
        this.file = file;
    }
    public String getFileFileName() {
        return fileFileName;
    }
    public void setFileFileName(String fileFileName) {
        this.fileFileName = fileFileName;
    }
    public String getFileContentType() {
        return fileContentType;
    }
    public void setFileContentType(String fileContentType) {
        this.fileContentType = fileContentType;
    }
}

4.批量的文件上傳實現

Action 的實現

public class BatchUploadAction {
    //File的名稱和表單域中的名稱相同
    private File[] file;
    //獲取文件名  文件名屬性 必須是  表單域名+FileName;
    private String[] fileFileName;
    //獲取文件的類型
    private String[] fileContentType;
    //上傳的處理方法
    public String upload(){
        String path=ServletActionContext.getServletContext().getRealPath("/upload");
        try {
            for(int i=0;i<file.length;i++)
                FileUtils.copyFile(file[i], new File(path,fileFileName[i]));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return Action.SUCCESS;
    }
    public File[] getFile() {
        return file;
    }
    public void setFile(File[] file) {
        this.file = file;
    }
    public String[] getFileFileName() {
        return fileFileName;
    }
    public void setFileFileName(String[] fileFileName) {
        this.fileFileName = fileFileName;
    }
    public String[] getFileContentType() {
        return fileContentType;
    }
    public void setFileContentType(String[] fileContentType) {
        this.fileContentType = fileContentType;
    }
}

Jsp

<script type="text/javascript" src="jquery-1.11.3.min.js"></script>
<script type="text/javascript">
    $(function(){
        $('#btn').click(function(){ var html=$("#content").html(); html+="文件:<input type='file' name='file'/><br>"; $("#content").html(html); });
        
    });
</script>
</head>
<body>
    <form action="batch.action" method="post" enctype="multipart/form-data">
    文件:<input type="file" name="file"/><input type="button" value="增加" id="btn"/><br>
    <div id="content"></div>
    <input type="submit" value="上傳"/>
    </form>
</body>

Struts.xml

<struts>
    <!-- 設置上傳文件大小的常量 
        maximumSize是單個文件大小
        maxSize 上傳總文件大小
        maximunSize=20M  maxSize=200M,說明一次可以上傳10個20M大小的文件
    -->
    <constant name="struts.multipart.maxSize" value="209715200"></constant>
    <package name="default" extends="struts-default" namespace="/">
        <action name="upload" class="cn.sxt.action.UploadAction" method="upload">
            <result>/success.jsp</result>
        </action>
        <action name="batch" class="cn.sxt.action.BatchUploadAction" method="upload">
            <result>/success.jsp</result>
            <interceptor-ref name="fileUpload">
                <!-- 設置上傳的單個文件大小 -->
                <param name="maximumSize">20971520</param>
            </interceptor-ref>
            <interceptor-ref name="defaultStack"></interceptor-ref>
        </action>
    </package>
</struts>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM