Struts2 提供了更为简便的文件上传机制,将文件上传的复杂操作都封装到commons-fileupload.jar 、commons-io.jar两个jar包中,然后再程序中使用简单的几句代码就能实现文件上传;
HTML:
<form action="${pageContext.request.contextPath}/hello/upload_uploadImage.do" enctype="multipart/form-data" method="post"> 图片:<input type="file" name="image" /> <input type="submit" value="上传" /> </form>
Struts.xml:
<action name="upload_*" class="com.actions.UploadAction" method="{1}"> <result name="message">/WEB-INF/message.jsp</result> </action>
action:
import java.io.File; import java.io.IOException; import org.apache.commons.io.FileUtils; import org.apache.struts2.ServletActionContext; public class UploadAction { //只要File的名称与html中File控件的name相一致就可以获取到这个文件 private File image; //只要使用file的name+FileName就可以获取到上传文件的名称 private String imageFileName; //只要使用file的name+ContentType就可以获取到上传文件的类型 private String imageContentType; private String message; public String uploadImage() { try { String realPath = ServletActionContext.getServletContext().getRealPath("/images"); File filePath = new File(realPath); if (!filePath.exists()) { filePath.mkdirs(); } System.out.println("文件存放路径:" + realPath); if (image != null) { System.out.println("文件名:" + imageFileName + ",文件类型:" + imageContentType); File saveFile = new File(filePath, imageFileName); //默认Struts2会将文件上传到Struts2临时空间中,当Action执行完成以后将文件删除; //要实现文件传,只需要将文件从临时空间copy到存储空间即可 FileUtils.copyFile(image, saveFile); message="文件上传成功!"; } } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return "message"; } public File getImage() { return image; } public void setImage(File image) { this.image = image; } public String getImageFileName() { return imageFileName; } public void setImageFileName(String imageFileName) { this.imageFileName = imageFileName; } public String getImageContentType() { return imageContentType; } public void setImageContentType(String imageContentType) { this.imageContentType = imageContentType; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }注:通过 <constant name="struts.multipart.maxSize" value="10701096"></constant> 可以设置上传文件的大小;
注:对于大文件上传,不推荐使用Web的方式进行上传,可以使用socket的方式;