文件上传和下载解析

表单元素的enctype属性:
application/x-www-form-urlencoded(默认)

1)默认编码方式,只处理表单域里的value属性值。

2)可通过request.getParameter()方法取得请求的参数。

multipart/form-data

1)以二进制流的方式处理表单数据,且会将文件域指定的文件内容也封装到请求参数里。

2)无法通过request.getParameter()方法取得请求的参数。

 

 

struts2的文件上传(action属性):

private File xxx;封装该文件对应的文件内容。

private String xxxFileName;该文件的文件名称。

private String xxxContentType;该文件的文件类型。

 

 

fileUpload拦截器:

allowedTypes属性:指定允许上传的文件类型。多文件用","

maximumSize属性:指定允许上传文件的大小。单位是字节。

过滤失败,返回input 逻辑视图。

需要显示的配置defaultStack 拦截器栈

 

 

文件上传的常量配置:

struts.multipart.saveDir:上传文件的临时文件夹。

默认使用javax.servlet.context.tempdir.

此临时文件夹在Tomcat的work\Catalina\localhost\下

应避免使用Tomcat的工作路径作为临时路径

struts.multipart.maxSize:上传文件的最大字节数。

可控制整个struts2应用里的上传文件的大小。

 

 

输出错误提示:

-<s:fileError/>

国际化错误提示的key

struts.message.error.file.too.large:上传文件过大。

struts.message.error.content.type.not.allowed:上传类型错误。

struts.message.error.uploading:文件上传出现未知错误。

 

 

文件下载

stream结果类型

contentType属性:指定被下载文件的文件类型。

inputName属性:指定被下载文件的入口输入流。

contentDisposition:

指定下载文件的处理方式(内联(inline)和附件(attachment))。

通过filename指定下载文件的文件名。

bufferSize属性:指定下载文件时的缓冲大小。

 

 

<form action="load_doPictureUpload.action" enctype="multipart/form-data" method="post">
	<table>
		<tr>
			<td>上传图片:</td>
			<td><input type="file" name="picture"/></td>
		</tr>
		<tr>
			<td><input type="submit" value="上传"/></td>
		</tr>
	</table>
</form>

 

 

 

文件名称:<a href="load_doDownPicture.action">下载</a>
 

 

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd" >
<struts>
	<!-- 程序国际化 指定国际化资源文件-->
	<constant name="struts.custom.i18n.resources" value="ApplicationResources"/>
	<!-- 指定request 和 response中的编码方式,相当于request.setCharacterEncoding("utf-8")
	     和response.setCharacterEncoding("utf-8") -->
	<constant name="struts.i18n.encoding" value="utf-8"/>
	<!-- 是否国际化信息自动加载 默认为false -->
	<constant name="struts.i18n.reload" value="false"/>
	<!-- 设置上传文件时不要Tomcat的临时路径,使用设置的值 -->
	<constant name="struts.multipart.saveDir" value="/"/>
	<!-- 设置上传文件大小,此处设置会对起最后的限制作用! -->
	<constant name="struts.multipart.maxSize" value="10485760"/>
	<!-- 该属性指定需要struts2 处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由struts处理
		如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开-->
	<constant name="struts.action.extension" value="action"/>
	<!-- 设置浏览器是否缓存静态内容,默认值为true(生成环境下使用),开发阶段最好关闭 -->
	<constant name="struts.serve.static.browserCache" value="false"/>
	<!-- 当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生成环境下使用),开发阶段最好打开 -->
	<constant name="struts.configuration.xml.reload" value="true"/>
	<!-- 开发模式下使用,这样可以 打印出更详细的错误信息 -->
	<constant name="struts.devMode" value="true"/>
	<!-- 默认的试图主题 -->
	<constant name="struts.ui.theme" value="simple"/>
	
	<package name="package-default" extends="json-default" abstract="true">
		<!-- 配置公共results -->
		<global-results>
			<!-- json 回调 -->
			<result name="jsonback" type="json">
				<param name="includeProperties">status</param>
			</result>
			<result name="error">/</result>
		</global-results>
		<!-- 异常处理 -->
		<global-exception-mappings>
			<exception-mapping result="error" exception="java.lang.Exception"/>
		</global-exception-mappings>
	</package>
	
	<!-- 通过include元素导入其他配置文件 -->
	<include file="strutsxml/struts_*.xml"/>
</struts>
 

 

 

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd" >
<struts>
	<package name="picture" extends="package-default">
		<action name="load_*" class="org.cric.action.LoadAction" method="{1}">
			<!-- 配置fileUpload的拦截器 -->
			<interceptor-ref name="fileUpload">
				<!-- 配置允许上传的文件的大小(字节) -->
				<param name="maximumSize">389377</param>
				<!-- 配置允许上传出的文件类型 -->
				<param name="allowedTypes">image/png,image/gif,image/jpeg</param>
			</interceptor-ref>
			<interceptor-ref name="defaultStack"/>
			<result name="input">/error.jsp</result>
			<result>/ok.jsp</result>
			
			<result name="down" type="stream">
				<!-- 指定下载文件的文件类型 -->
				<param name="contentType">image/gif</param>
				<!-- 指定由getTageFile()方法返回被下载文件的InputStream -->
				<param name="inputName">inputStream</param>
				<param name="contentDisposition">attachment;filename="${fileName}"</param>
				<!-- 指定下载文件时的缓冲 -->
				<param name="bufferSize">2048</param>
			</result>
		</action>
	</package>
</struts>

 

 

 

package org.cric.action;

import java.io.File;
import java.io.InputStream;
import org.apache.struts2.ServletActionContext;
import org.cric.util.ImgWriteUtil;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;

public class LoadAction extends ActionSupport {
	
	private File picture;//封装文件域对应的文件内容
	private String pictureFileName;//该文件的文件名称
	private String pictureContentType;//该文件的文件类型
	private String image;
	private String fileName;
	private InputStream inputStream;
	
	public InputStream getInputStream() {
		return inputStream;
	}
	public void setInputStream(InputStream inputStream) {
		this.inputStream = inputStream;
	}
	public String getFileName() {
		return fileName;
	}
	public void setFileName(String fileName) {
		this.fileName = fileName;
	}
	public String getImage() {
		return image;
	}
	public void setImage(String image) {
		this.image = image;
	}
	public File getPicture() {
		return picture;
	}
	public void setPicture(File picture) {
		this.picture = picture;
	}
	public String getPictureFileName() {
		return pictureFileName;
	}
	public void setPictureFileName(String pictureFileName) {
		this.pictureFileName = pictureFileName;
	}
	public String getPictureContentType() {
		return pictureContentType;
	}
	public void setPictureContentType(String pictureContentType) {
		this.pictureContentType = pictureContentType;
	}
	//
	//
	public String doPictureUpload() throws Exception{
		String pathStr=ServletActionContext.getRequest().getRealPath("/image");//获取项目实际运行的路径
		String endStr=this.getPictureFileName().substring(this.getPictureFileName().lastIndexOf("."));//获取图片的后缀名
		String nameStr=String.valueOf(System.currentTimeMillis());//获取名称
		String picturePath=pathStr+"/"+nameStr+endStr;
		File toFile=new File(picturePath);
		ImgWriteUtil imgWriteUtil = new ImgWriteUtil();
		imgWriteUtil.writeImg(picture, toFile);
		this.image="image/"+nameStr+endStr;
		return Action.SUCCESS;
	}
	public String doDownPicture() throws Exception{
		fileName="中文.gif";
		fileName=new String(fileName.getBytes("GB2312"),"ISO8859-1");
		this.setInputStream(ServletActionContext.getServletContext().getResourceAsStream("/image/1287400068000.gif"));
		return "down";
	}
}
 

 

 

 

/**
 * 写入图片
 */
package org.cric.util;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class ImgWriteUtil {
	private BufferedInputStream bis;
	private BufferedOutputStream bos;

	public void writeImg(File fromfile, File tofile) {// 写入图片
		int len = 0;
		int size = 0;
		try {
			bis = new BufferedInputStream(new FileInputStream(fromfile));
			bos = new BufferedOutputStream(new FileOutputStream(tofile));
			size = (int) fromfile.length();
			byte[] buffer = new byte[size];
			while ((len = bis.read(buffer)) > 0) {
				bos.write(buffer, 0, len);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
			throw new RuntimeException("创建文件时出错!");
		} catch (IOException e) {
			e.printStackTrace();
			throw new RuntimeException("读写文件时出错!");
		} finally {
			try {
				if (bos != null) {
					bos.close();
				}
				if (bis != null) {
					bis.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值