Struts2中檔案上傳的兩種方式

來源:互聯網
上載者:User

Struts2中的檔案上傳,方式很多,大體原理不變。一種是通過POST請求上傳,另一種Struts2封裝好的欄位驅動的方式上傳。


1.第一種:

public String uploadImage() {        boolean result = false;        /**        *擷取request對象,在Struts2或者Servlet中同理        */        HttpServletRequest req = ServletActionContext.getRequest();        DiskFileItemFactory factory = new DiskFileItemFactory();        factory.setRepository(new File(getUploadFileSavePath(req)));        factory.setSizeThreshold(1024 * 1024 * 2);                                                                                                                                                                                                                                                                       ServletFileUpload upload = new ServletFileUpload(factory);        List<?> items = null;        try {            items = upload.parseRequest(req);        } catch (FileUploadException e1) {            e1.printStackTrace();        }        for (int i = 0; i < items.size(); i++) {            FileItem item = (FileItem) items.get(i);            if (item.isFormField()) {                continue;            } else {                String fileName = item.getName();                /**                *StringUtils工具產生時間戳記作為檔案名稱,可擴充                */                String dstFile = StringUtils.timeStamp()                        + fileName.substring(fileName.lastIndexOf('.'));                String dstFileName = getUploadFileSavePath(req)                        + File.separator + dstFile;                FileOutputStream fos;                try {                    fos = new FileOutputStream(dstFileName);                    if (item.isInMemory()) {                        InputStream in;                        in = item.getInputStream();                        byte[] btn = new byte[1024];                        int size;                        while ((size = in.read(btn)) > 0) {                            fos.write(btn, 0, size);                        }                        in.close();                        fos.close();                    }                } catch (FileNotFoundException e) {                    e.printStackTrace();                } catch (IOException e) {                    e.printStackTrace();                }            }        }    }

依賴的上傳組件是:org.apache.commons.fileupload

原理:通過請求來判斷Form中的欄位類型,屬於檔案類型則上傳檔案。

2.第二種:

public class UploadAction extends ActionSupport {    private static final long serialVersionUID = 7545315675701301471L;    /**     * 上傳檔案     */    private File ccImage;    /**     * 下面的兩個欄位因ccImage欄位存在,而且命名分別是xxxContentType,xxxFileName     */    /**     * 檔案類型Meta資訊)     */    private String ccImageContentType;    /**     * 上傳的檔案名稱     */    private String ccImageFileName;    private HttpServletRequest request = ServletActionContext.getRequest();    /**     * 擷取工程的訪問URL根路徑:例如:http://127.0.0.1:8080/工程名     */    private String basePath = request.getScheme() + "://"            + request.getServerName() + ":" + request.getServerPort()            + request.getContextPath();    /**     * 上傳檔案     *     * @return     */    public String upload() {        boolean result = false;        String dstFile = StringUtils.timeStamp()                + ccImageFileName.substring(ccImageFileName.lastIndexOf('.'));        String dstFileName = getUploadFileSavePath() + File.separator + dstFile;        File destFile = new File(dstFileName);        try {            FileUtils.copyFile(ccImage, destFile);        } catch (IOException e) {            e.printStackTrace();        }        return result ? Action.SUCCESS : Action.ERROR;    }    /**     * 擷取上傳檔案的路徑     *     * @return     */    private String getUploadFileSavePath() {        @SuppressWarnings("deprecation")        /**         * Const.UPLOAD_HEAD_PATH:可配置的變數         */        String path = request.getRealPath(Const.UPLOAD_HEAD_PATH);        File dir = new File(path);        if (!dir.exists()) {            dir.mkdirs();        }        return path;    }    /**     * Struts2對於上傳檔案進行了封裝,set方法必須存在,通過set方法和為欄位進行賦值     * @return     */    public String getCcImageContentType() {        return ccImageContentType;    }    public void setCcImageContentType(String ccImageContentType) {        this.ccImageContentType = ccImageContentType;    }    public File getCcImage() {        return ccImage;    }    public void setCcImage(File ccImage) {        this.ccImage = ccImage;    }    public String getCcImageFileName() {        return ccImageFileName;    }    public void setCcImageFileName(String ccImageFileName) {        this.ccImageFileName = ccImageFileName;    }    public String getBasePath() {        return basePath;    }    public void setBasePath(String basePath) {        this.basePath = basePath;    }}

上面的UploadAction類中的屬性有File,String其中後兩個屬性因為第一個屬性存在而存在,有一定的關聯性,這裡既可以看成是屬性驅動,也可以是模型驅動。Struts2對檔案上傳的這個過程進行了很好的封裝,這裡注意屬性的命名和set方法即可。

Struts上傳檔案配置:

<!-- 指定允許上傳的檔案最大位元組數。預設值是2097152(2M) --><constant name="struts.multipart.maxSize" value="2097152" />

Action的配置

<interceptor-ref name="fileUpload">    <param name="allowedTypes">image/bmp,image/png,image/gif,image/jpeg</param></interceptor-ref><interceptor-ref name="defaultStack" />

關於Struts的檔案上傳攔截器參見類:

org.apache.struts2.interceptor.FileUploadInterceptor


末了:寫這篇文章,不在內容,在意義,在開發中上傳檔案遇到了一些問題,百度了一下,很多都是泊來品,於是回到官方文檔,很多問題都是能解決了,紀念一下,警示自己少百度,少Google,溯本逐源才能做好真學問。

本文出自 “野馬紅塵” 部落格,謝絕轉載!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.