struts2文件上傳,獲取文件名和文件類型

Action中還有兩個屬性:uploadFileName和uploadContentType,這兩個屬性分別用於封裝上傳文件的文件名、 文件類型。這是Struts2設計的獨到之處:Strut2的Action類直接經過File類型屬性直接封裝了上傳文件的文件內容,但這個File屬性 沒法獲取上傳文件的文件名和文件類型,因此Struts2就直接將文件域中包含的上傳文件名和文件類型的信息封裝到uploadFileName和 uploadContentType屬性中,也就是說Struts2針對表單中名爲xxx的文件域,在對應的Action類中使用3個屬性來封裝該文件域 信息:
l 類型爲File的xxx屬性:用來封裝頁面文件域對應的文件內容。
l 類型爲String的xxxFileName屬性:用來封裝該文件域對應的文件的文件名。
l 類型爲String的xxxContentType屬性:用來封裝該文件域應用的文件的文件類型。

如下是實際java代碼:

jsp頁面:

<input type="file" id="upload" name="upload"/>  這個name就是與Action的屬性對應




Action類代碼:

private File upload;
    private String uploadFileName;
    private String uploadContentType;

    public void setUpload(File upload) {
        this.upload = upload;
    }
    
    public void setUploadFileName(String uploadFileName) {
        this.uploadFileName = uploadFileName;
    }

    public void setUploadContentType(String uploadContentType) {
        this.uploadContentType = uploadContentType;
    }




設置3個屬性。分別給set方法. 這樣子,就可以獲取上傳的文件,文件名,文件類型。

注意:這個uploadFileName,uploadContentType。若是File 屬性名xxx(private File xxx;) 。那這個必須是xxxFileName, xxxContentType。而後也是分別給set 方法就能夠。

特 別注意:,<s:file/>標誌不單單是綁定到upload,還有uploadContentType(上傳文件的MIME類型)和 uploadFileName(上傳文件的文件名,該文件名不包括文件的路徑)。所以,<s:file name="xxx" />對應Action類裏面的xxx、xxxContentType和xxxFileName三個屬性。 java

struts2上傳文件的時候,action裏面獲取上傳文件的文件名和類型的原理是什麼?

在jsp頁面代碼;


<s:file name="upload" label="上傳的文件" />



action中,聲明代碼: app

private File upload;  
private String uploadContentType; // 文件的內容類型  
private String uploadFileName; // 上傳文件名





這裏有個疑問, 文件名和文件類型是如何獲取的? jsp

約定,在struts2內部的的FileUploadInterceptor完成的

String[] fileName = multiWrapper.getFileNames(inputName);//獲得請求的全部文件名

                if (isNonEmpty(fileName)) {
                    // get a File object for the uploaded File
                    File[] files = multiWrapper.getFiles(inputName);
                    if (files != null && files.length > 0) {
                        List<File> acceptedFiles = new ArrayList<File>(files.length);
                        List<String> acceptedContentTypes = new ArrayList<String>(files.length);
                        List<String> acceptedFileNames = new ArrayList<String>(files.length);
                        String contentTypeName = inputName + "ContentType";//默認就是input名稱+ContentType
                        String fileNameName = inputName + "FileName";//默認就是input名稱+FileName

                        for (int index = 0; index < files.length; index++) {
                            if (acceptFile(action, files[index], fileName[index], contentType[index], inputName, validation, ac.getLocale())) {
                                acceptedFiles.add(files[index]);
                                acceptedContentTypes.add(contentType[index]);
                                acceptedFileNames.add(fileName[index]);
                            }
                        }

                        if (!acceptedFiles.isEmpty()) {
                            Map<String, Object> params = ac.getParameters();//添加到parameters中 這樣就能夠經過OGNL注入到action了

                            params.put(inputName, acceptedFiles.toArray(new File[acceptedFiles.size()]));
                            params.put(contentTypeName, acceptedContentTypes.toArray(new String[acceptedContentTypes.size()]));
                            params.put(fileNameName, acceptedFileNames.toArray(new String[acceptedFileNames.size()]));
                        }
                    }


參考文檔: this

http://blog.163.com/linfenliang@126/blog/static/127857195201171205937621/ spa

http://www.iteye.com/problems/89011 設計

相關文章
相關標籤/搜索