`
chengyu2099
  • 浏览: 459834 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

struts2上传

 
阅读更多
1、struts2上传
以下是一个上传涉及的代码,从view到action的各个阶段代码:
页面:
Html代码  
<form action="../upload/upload.action" id="exForm" method="post" enctype="multipart/form-data" >  
        <ul>  
            <li>  
                <input type="file" name="uploadFile" size="20"/>  
                <input type="submit" value="导入"/>  
            </li>  
        </ul>  
</form>  
 
 action代码:
Java代码  
public class UploadFileAction extends ActionSupport {  
  
    private static final long serialVersionUID = 5563083429360573304L;  
    /** 上传文件 */  
    private File                uploadFile;  
    private String            uploadFileFileName;  
    private String            uploadFileContentType;  
  
    public String upload() {  
        try {  
            //这里是上传文件,可做具体处理  
            IOUtils.copy(new FileInputStream(uploadFile), new FileOutputStream(new File("C:\\" + uploadFileFileName)));  
            System.out.println(uploadFileFileName);  
            System.out.println(uploadFileContentType);  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        return SUCCESS;  
    }  
}  
 
 配置文件就不再描述。以上就是在struts2中上传涉及的代码,同时还可以支持同时上传多个文件:
支持同时上传多个文件:
Html代码  
<form action="../upload/upload.action" id="exForm" method="post" enctype="multipart/form-data" >  
        <ul>  
            <li>  
                <input type="file" name="uploadFiles" size="20"/>  
        <input type="file" name="uploadFiles" size="20"/>  
        <input type="file" name="uploadFiles" size="20"/>  
                <input type="submit" value="导入"/>  
        <input type="input" name="message"/>  
            </li>  
        </ul>  
</form>  
和action代码:
Java代码  
public class UploadFileAction extends ActionSupport {  
  
    private static final long serialVersionUID = 5563083429360573304L;  
    /** 上传文件 */  
    private File[]            uploadFiles;  
    private String[]          uploadFilesFileName;  
    private String[]          uploadFilesContentType;  
  
    public String upload() {  
        try {  
            int index = 0;  
            for (File file : uploadFiles) {  
                IOUtils.copy(new FileInputStream(file), new FileOutputStream(new File("C:\\"  
                        + uploadFilesFileName[index])));  
                System.out.println(uploadFilesFileName[index]);  
                System.out.println(uploadFilesContentType[index]);  
                index++;  
            }  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        return SUCCESS;  
    }}  
 
 
2、几点说明
1、在上面上传过程中,页面file域属性名与action中File保持一致。如上:
Java代码  
name="uploadFile"   
和  
private File            uploadFile  
多个文件需要是数组。
 
2、之所以如此简单,得益于struts2中默认package:struts-default中
Java代码  
<interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor"/>  
 在FileUploadInterceptor中讲HttpServletRequest请求对象封装成MultiPartRequestWrapper,对上传文件提供了对上传文件的各种处理:

这里提供了对文件、文件名、contentType等属性获取的封装,当然也有对普通表单字段的封装,即如果在上传的表单中有非file域也统一可以获取,而这在普通的servlet上传中并不能简单的处理,如上面的多个文件上传表单中的message,只需要在action中有相应的getter/setter即可获取这些属性。而完成这一切的是一个叫MultiPartRequest的家伙。
 
3、MultiPartRequest
这是上传拦截器中处理封装的具体类,这涉及struts2中上传的底层具体实现,在这个接口中,我们能看到struts2中提供了一个默认的实现:
Java代码  
public class JakartaMultiPartRequest implements MultiPartRequest  
在struts2的default.properties中解析有如下说明:
Java代码  
### Parser to handle HTTP POST requests, encoded using the MIME-type multipart/form-data  
# struts.multipart.parser=cos  
# struts.multipart.parser=pell  
struts.multipart.parser=jakarta  
# uses javax.servlet.context.tempdir by default  
struts.multipart.saveDir=  
struts.multipart.maxSize=2097152  
这里对MIME-type为multipart/form-data的几种支持,而默认为jakarta,即在使用struts2的上传,需要添加相应的依赖(版本自行控制):
Java代码  
<dependency>  
    <groupId>commons-fileupload</groupId>  
    <artifactId>commons-fileupload</artifactId>  
    <version>1.2.1</version>  
</dependency>  
<dependency>  
    <groupId>commons-io</groupId>  
    <artifactId>commons-io</artifactId>  
    <version>1.3.2</version>  
</dependency>  
  
4、关于file、filename、contentType
前面已经说了,在action中的File需要和也没file域中的名字保持一致,如果多个则是File数组。而如果要获取fileName以及相应的contentType,命名也有一定的限制,如上面的action中:
Java代码  
private File[]            uploadFiles;  
private String[]          uploadFilesFileName;  
private String[]          uploadFilesContentType;  
 而这里的命名来自FileUploadInterceptor中对MultiPartRequestWrapper解析完放置于ActionContext中所作的处理:
见MultiPartRequestWrapper中:
Java代码  
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";  
                        String fileNameName = inputName + "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();  
  
                            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()]));  
                        }  
                    }  
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics