现在的位置: 首页 > 综合 > 正文

Struts2实现文件上传

2018年06月05日 ⁄ 综合 ⁄ 共 3752字 ⁄ 字号 评论关闭

在讲文件上传之前,我们先来看表单的enctype属性。

application/x-www-form-urlencoded:默认值,表单数据被编码为"名称/值",这是标准的编码方式。

multipart/form-data:上传二进制数据,只有使用multilpart/form-data,才能完整的传递数据,进行文件上传。

text/plain:表单数据以纯文本的形式进行编码,其中不含任何控件或格式字符。

Struts2使用的上传框架:Common-FileUpload => apache的开源项目,由jakarta项目组开发。

使用jar包:

1:commons-fileupload-XXX.jar(http://jakarta.apache.org/commons/fileupload/)

2:commons-io-XXX.jar(http://jakarta.apache.org/commons/io/)

项目演示:

upload.jsp:

<body>
    <form action="uploadAction_test.action" method="post" enctype="multipart/form-data">
   	 请选择文件:<input type="file" name="uploadFile"/>
   	 <input type="submit" value="提交">
    </form>
  </body>

注:在上传页面的form表单中必须加上属性:enctype="multipart/form-data"
UploadAction.java:

public class UploadAction {

	/* 定义上传文件 */
	private File uploadFile;
	/* 定义上传文件的类型 【文件+ContentType不能省略和拼写错误】*/
	private String uploadFileContentType;
	/* 定义上传文件的原始名称 【文件+FileName不能省略和拼写错误】*/
	private String uploadFileFileName;

	public File getUploadFile() {
		return uploadFile;
	}

	public void setUploadFile(File uploadFile) {
		this.uploadFile = uploadFile;
	}

	public String getUploadFileContentType() {
		return uploadFileContentType;
	}

	public void setUploadFileContentType(String uploadFileContentType) {
		this.uploadFileContentType = uploadFileContentType;
	}

	public String getUploadFileFileName() {
		return uploadFileFileName;
	}

	public void setUploadFileFileName(String uploadFileFileName) {
		this.uploadFileFileName = uploadFileFileName;
	}

	/* 测试方法 */
	public String test() throws IOException {

		/* 假设保存的虚拟路径为/upload,通过虚拟路径去获取绝对路径 */
		String realPath = ServletActionContext.getRequest().getRealPath("/upload");
		/* 构造文件路径 */
		File file = new File(realPath);
		/* 如果不存在 */
		if (!file.exists()) {
			file.mkdirs();
		}
		/* 使用struts2的工具类进行上传,第二个参数是目标文件(我们通过文件加上文件名的方式进行构建) */
		FileUtils.copyFile(uploadFile, new File(file, uploadFileFileName));

		return "ok";
	}
}

多文件上传:

upload.jsp:

 <body>
    <form action="uploadAction_test.action" method="post" enctype="multipart/form-data">
   	 请选择文件:<input type="file" name="uploadFiles"/></br>
   	 <input type="file" name="uploadFiles"/></br>
   	 <input type="submit" value="提交">
    </form>
  </body>

UploadAction.java:

public class UploadAction {

	/* 定义上传文件 */
	private File[] uploadFiles;
	/* 定义上传文件的类型 【文件+ContentType不能省略和拼写错误】 */
	private String[] uploadFilesContentType;
	/* 定义上传文件的原始名称 【文件+FileName不能省略和拼写错误】 */
	private String[] uploadFilesFileName;

	public File[] getUploadFiles() {
		return uploadFiles;
	}

	public void setUploadFiles(File[] uploadFiles) {
		this.uploadFiles = uploadFiles;
	}

	public String[] getUploadFilesContentType() {
		return uploadFilesContentType;
	}

	public void setUploadFilesContentType(String[] uploadFilesContentType) {
		this.uploadFilesContentType = uploadFilesContentType;
	}

	public String[] getUploadFilesFileName() {
		return uploadFilesFileName;
	}

	public void setUploadFilesFileName(String[] uploadFilesFileName) {
		this.uploadFilesFileName = uploadFilesFileName;
	}

	/* 测试方法 */
	public String test() throws IOException {

		/* 假设保存的虚拟路径为/upload,通过虚拟路径去获取绝对路径 */
		String realPath = ServletActionContext.getRequest().getRealPath("/upload");
		/* 构造文件路径 */
		File file = new File(realPath);
		/* 如果不存在 */
		if (!file.exists()) {
			file.mkdirs();
		}

		/* 遍历所有上传的文件 */
		for (int i = 0; i < uploadFiles.length; i++) {
			/* 获取文件 */
			File uploadFile = uploadFiles[i];
			/* 上传 */
			FileUtils.copyFile(uploadFile, new File(file, uploadFilesFileName[i]));
		}

		return "ok";
	}
}

附加:上传文件的类型拦截
在struts.xml文件中拦截上传文件的类型:

	<action name="uploadAction_*" class="com.lixue.web.action.UploadAction" method="{1}">
			<interceptor-ref name="defaultStack">
				<param name="fileUpload.allowedTypes"><!-- fileUpload.allowedTypes为固定写法 -->
					image/png,image/jpeg
				</param>
			</interceptor-ref>
			<result name="ok">/uploadOK.jsp</result>
			<result name="input">/fileInput.jsp</result><!-- 当文件类型不支持时,系统默认转发到input视图 -->
		</action>

在struts.xml文件中加入如下常量:

<!-- 国际化文件(message是我们自定义的属性文件的文件名) -->
	<constant name="struts.custom.i18n.resources" value="message" />

fileInput.jsp视图(这个标签的内容是通过系统注入的):

<body>
    <s:fielderror></s:fielderror>
  </body>

注:如果这仅仅这样配置的话,提示的是英文,所以要使用国际化:

1.在src目录下添加一个message.properties文件。

2.用视图add的方式添加属性: struts.messages.error.content.type.not.allowed(如图)

抱歉!评论已关闭.