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三个属性。

struts2上传文件的时候,action里面获取上传文件的文件名和类型的原理是什么?

在jsp页面代码;


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



action中,声明代码:

private File upload;  
private String uploadContentType; // 文件的内容类型  
private String uploadFileName; // 上传文件名





这里有个疑问, 文件名和文件类型是如何获取的?

约定,在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()]));
                        }
                    }


参考文档:

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

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



你可能感兴趣的:(struts2文件上传,获取文件名和文件类型)