struts2文件上传下载(含中文编码问题)
2016-09-29 17:25
501 查看
1.上传界面jsp
enctype属性一定要写成multipart/form-data不然就会以二进制文本上传到服务器端,使用 get/post方法对中文编码转码有影响
[html] view
plain copy
<form enctype="multipart/form-data" action="" method="post">
<input type="file" id="choosefile" />
<input type="file" id="f" style="display:none;" />
<input type="submit" value="上传文件" id="submitBtn" />
</form>
2.文件上传
[java] view
plain copy
public class FileUploadAction extends ActionSupport
{ <p> <span style="color:#009900;">//file<span style="font-family:宋体;">是文件上传过来存放在临时文件夹下面的文件</span></span>
</p> private File file;
<span style="color:#009900;">//提交过来的file的名字</span>
private String fileFileName;
<span style="color:#009900;">//提交过来的file的MIME类型</span>
private String fileContentType;
public File getFile()
{
return file;
}
public void setFile(File file)
{
this.file = file;
}
public String getFileFileName()
{
return fileFileName;
}
public void setFileFileName(String fileFileName)
{
this.fileFileName = fileFileName;
}
public String getFileContentType()
{
return fileContentType;
}
public void setFileContentType(String fileContentType)
{
this.fileContentType = fileContentType;
}
@Override
public String execute() throws Exception
//ServletActionContext.getServletContext().getRealPath()获得文件所在文件夹的相对路径在WebRoot下事先建立upload文件夹,上传的文件临时存在这里
String root = ServletActionContext.getServletContext().getRealPath("/upload");
InputStream is = new FileInputStream(file);
OutputStream os = new FileOutputStream(new File(root, fileFileName));
byte[] buffer = new byte[500];
while(-1 != (is.read(buffer, 0, buffer.length)))
{
os.write(buffer);
}
os.close();
is.close();
}
}
3.struts.xml上传配置
[html] view
plain copy
<!--要设置struts文件上传的大小,这里是1048576000/(1024*1024)=10M之前没设置大文件上传时服务器直接重置-->
<constant name="struts.multipart.maxSize" value="1048576000"/>
<action name="addVideo" class="com.scholar.action.VideoServiceAction">
<!-- fileUpload拦截器配置 -->
<interceptor-ref name="fileUpload">
<!--设置上传文件最大字节数10M -->
<param name="maximumSize">10485760</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"/>
<!-- 设置上传文件的保存位置 -->
<param name="savePath">upload</param>
<result name="success">Success.jsp</result>
<result name="input">Error.jsp</result>
</action>
注意:
1. jsp中只有name="file"的一个元素,而action中却要得到三个数据 file,fileFileName,fileContentType,这是struts 2中文件上传机制自行实现的。
2.上传文件过程中upload只是临时存放文件的作用,文件上传完毕后会删除数据,所以,在myeclipse的WebRoot下的upload文件中任何时候看都是没有任何文件的,那么上传的文件在哪?
其实是在Tomcat中,打开路径:apache-tomcat-7.0.65-windows-x64\apache-tomcat-7.0.65\webapps\scholar\upload
原来文件最终是上传到了Tomcat服务器中,只有这里有文件才能算是上传成功。
项目的目的是将文件路径上传到了数据库中(代码省略),文件其实存在了服务器中。
4.下载界面jsp
[plain] view
plain copy
//动态获取相对应的文件,赋值给fileName
<li>${fileFileName}<a href="fileDownload.action?fileName=${uploadFileName}">下载</a></li>
5.下载文件(中文命名文件未完全解决,但有试调过程,知道了些东西分享下)
[java] view
plain copy
public class FileDownload extends ActionSupport{
private String fileName;// 初始的通过param指定的文件名属性
private String inputPath;// 指定要被下载的文件路径
public InputStream getInputStream() throws Exception {
// 通过 ServletContext,也就是application 来读取数据
return ServletActionContext.getServletContext().getResourceAsStream(inputPath+"\\"+fileName);
}
public String execute() throws Exception {
return SUCCESS;
}
public void setInputPath(String value) {
inputPath = value;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public String getFileName() {
return this.fileName;
}
}
6.struts.xml
[html] view
plain copy
<action name="fileDownload" class="com.scholar.action.FileDownload">
<!-- 设置文件所在位置 -->
<param name="inputPath">/upload</param>
<!-- 下载显示的文件名称 -->
<param name="fileName">${fileName}</param>
<result name="success" type="stream">
<!-- 指定下载文件的文件类型 -->
<param name="contentType">application/octet-stream;</param>
<!-- 指定stream方法名称 -->
<param name="inputName">inputStream</param>
<!-- 文件下载的处理方式,包括内联(inline)和附件(attachment)两种方式,默认为直接显示文件 -->
<param name="contentDisposition">attachment;fileName="${fileName}" </param>
<!-- 指定下载文件的缓冲大小 -->
<param name="bufferSize">40960</param>
</result>
注意:
1.英文的文件上传没有问题,但是中文上传就报错:
Can not find a Java.io.InputStream with the name
[InputStream] in the invocation stack.Check the<param name="inputName'> tag specified for this action.
翻译过来以为是inputName的设置问题,其实也可能是中文命名的文件在Tomcat的upload文件夹下找不到要下载的文件。
测试方法:打印getInpuStream的返回值
[java] view
plain copy
public void getInputStream() throws Exception {
InputStream in = ServletActionContext.getServletContext().getResourceAsStream(inputPath+"\\"+fileName);
System.out.println("\n in = "+in);
}
如果 in = null 则表示找不到文件,可能是路径错误或者找不到文件(可能就是编码问题)
编码问题原因:项目中所有文件编码都使用UTF-8编码,但是Tomcat传输的编码默认是ISO8859-1编码,编码方式不一致导致文件名匹配不成功找不到文件。
打开文件:apache-tomcat-7.0.65-windows-x64\apache-tomcat-7.0.65\conf \ server.xml
没有URIEncoding="UTF-8"属性的话就是默认的ISO8859-1编码,手动添加:
[html] view
plain copy
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8"/>
这样中文命名的文件也可以正确匹配并且下载,但是在下载框中中文会显示为空,会显示英文部分。
最近又知道MyEclipse中Java文件默认的编码是GBK
意思是:
jsp编码:UTF-8(默认是ISO8859-1)
Java编码:GBK(默认)
Tomcat传输编码:ISO8859-1(默认)
enctype属性一定要写成multipart/form-data不然就会以二进制文本上传到服务器端,使用 get/post方法对中文编码转码有影响
[html] view
plain copy
<form enctype="multipart/form-data" action="" method="post">
<input type="file" id="choosefile" />
<input type="file" id="f" style="display:none;" />
<input type="submit" value="上传文件" id="submitBtn" />
</form>
2.文件上传
[java] view
plain copy
public class FileUploadAction extends ActionSupport
{ <p> <span style="color:#009900;">//file<span style="font-family:宋体;">是文件上传过来存放在临时文件夹下面的文件</span></span>
</p> private File file;
<span style="color:#009900;">//提交过来的file的名字</span>
private String fileFileName;
<span style="color:#009900;">//提交过来的file的MIME类型</span>
private String fileContentType;
public File getFile()
{
return file;
}
public void setFile(File file)
{
this.file = file;
}
public String getFileFileName()
{
return fileFileName;
}
public void setFileFileName(String fileFileName)
{
this.fileFileName = fileFileName;
}
public String getFileContentType()
{
return fileContentType;
}
public void setFileContentType(String fileContentType)
{
this.fileContentType = fileContentType;
}
@Override
public String execute() throws Exception
//ServletActionContext.getServletContext().getRealPath()获得文件所在文件夹的相对路径在WebRoot下事先建立upload文件夹,上传的文件临时存在这里
String root = ServletActionContext.getServletContext().getRealPath("/upload");
InputStream is = new FileInputStream(file);
OutputStream os = new FileOutputStream(new File(root, fileFileName));
byte[] buffer = new byte[500];
while(-1 != (is.read(buffer, 0, buffer.length)))
{
os.write(buffer);
}
os.close();
is.close();
}
}
3.struts.xml上传配置
[html] view
plain copy
<!--要设置struts文件上传的大小,这里是1048576000/(1024*1024)=10M之前没设置大文件上传时服务器直接重置-->
<constant name="struts.multipart.maxSize" value="1048576000"/>
<action name="addVideo" class="com.scholar.action.VideoServiceAction">
<!-- fileUpload拦截器配置 -->
<interceptor-ref name="fileUpload">
<!--设置上传文件最大字节数10M -->
<param name="maximumSize">10485760</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"/>
<!-- 设置上传文件的保存位置 -->
<param name="savePath">upload</param>
<result name="success">Success.jsp</result>
<result name="input">Error.jsp</result>
</action>
注意:
1. jsp中只有name="file"的一个元素,而action中却要得到三个数据 file,fileFileName,fileContentType,这是struts 2中文件上传机制自行实现的。
2.上传文件过程中upload只是临时存放文件的作用,文件上传完毕后会删除数据,所以,在myeclipse的WebRoot下的upload文件中任何时候看都是没有任何文件的,那么上传的文件在哪?
其实是在Tomcat中,打开路径:apache-tomcat-7.0.65-windows-x64\apache-tomcat-7.0.65\webapps\scholar\upload
原来文件最终是上传到了Tomcat服务器中,只有这里有文件才能算是上传成功。
项目的目的是将文件路径上传到了数据库中(代码省略),文件其实存在了服务器中。
4.下载界面jsp
[plain] view
plain copy
//动态获取相对应的文件,赋值给fileName
<li>${fileFileName}<a href="fileDownload.action?fileName=${uploadFileName}">下载</a></li>
5.下载文件(中文命名文件未完全解决,但有试调过程,知道了些东西分享下)
[java] view
plain copy
public class FileDownload extends ActionSupport{
private String fileName;// 初始的通过param指定的文件名属性
private String inputPath;// 指定要被下载的文件路径
public InputStream getInputStream() throws Exception {
// 通过 ServletContext,也就是application 来读取数据
return ServletActionContext.getServletContext().getResourceAsStream(inputPath+"\\"+fileName);
}
public String execute() throws Exception {
return SUCCESS;
}
public void setInputPath(String value) {
inputPath = value;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public String getFileName() {
return this.fileName;
}
}
6.struts.xml
[html] view
plain copy
<action name="fileDownload" class="com.scholar.action.FileDownload">
<!-- 设置文件所在位置 -->
<param name="inputPath">/upload</param>
<!-- 下载显示的文件名称 -->
<param name="fileName">${fileName}</param>
<result name="success" type="stream">
<!-- 指定下载文件的文件类型 -->
<param name="contentType">application/octet-stream;</param>
<!-- 指定stream方法名称 -->
<param name="inputName">inputStream</param>
<!-- 文件下载的处理方式,包括内联(inline)和附件(attachment)两种方式,默认为直接显示文件 -->
<param name="contentDisposition">attachment;fileName="${fileName}" </param>
<!-- 指定下载文件的缓冲大小 -->
<param name="bufferSize">40960</param>
</result>
注意:
1.英文的文件上传没有问题,但是中文上传就报错:
Can not find a Java.io.InputStream with the name
[InputStream] in the invocation stack.Check the<param name="inputName'> tag specified for this action.
翻译过来以为是inputName的设置问题,其实也可能是中文命名的文件在Tomcat的upload文件夹下找不到要下载的文件。
测试方法:打印getInpuStream的返回值
[java] view
plain copy
public void getInputStream() throws Exception {
InputStream in = ServletActionContext.getServletContext().getResourceAsStream(inputPath+"\\"+fileName);
System.out.println("\n in = "+in);
}
如果 in = null 则表示找不到文件,可能是路径错误或者找不到文件(可能就是编码问题)
编码问题原因:项目中所有文件编码都使用UTF-8编码,但是Tomcat传输的编码默认是ISO8859-1编码,编码方式不一致导致文件名匹配不成功找不到文件。
打开文件:apache-tomcat-7.0.65-windows-x64\apache-tomcat-7.0.65\conf \ server.xml
没有URIEncoding="UTF-8"属性的话就是默认的ISO8859-1编码,手动添加:
[html] view
plain copy
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8"/>
这样中文命名的文件也可以正确匹配并且下载,但是在下载框中中文会显示为空,会显示英文部分。
最近又知道MyEclipse中Java文件默认的编码是GBK
意思是:
jsp编码:UTF-8(默认是ISO8859-1)
Java编码:GBK(默认)
Tomcat传输编码:ISO8859-1(默认)
相关文章推荐
- 使用jQuery.wechat构建微信WEB应用
- 如何利用AngularJS打造一款简单Web应用
- Struts - 标签库
- struts1.0于struts2.0的比较
- SpreadJS 导入&导出 Excel 文件
- tomcat部署web应用
- Node.js+Yeoman构建前端自动化Web应用
- 技术测试管理系统之easyUI布局
- 解决Web应用中的乱码问题
- web
- 关于Servlet
- Struts2 初始配置流程
- Struts2中关于namespace的学习心得
- Struts2----自定义action的学习心得
- HTTP Status 404 - There is no Action mapped for namespace [/] and action name [login!welcome] associ
- Web应用环境下不同页面之间的传值(本文暂时只讨论 form表单数据提交)
- SQL注入之我见
- struts2
- 自己电脑做网站服务器,解决动态IP、无公网IP、80端口被屏蔽、HTTP被过滤的问题
- c#开源项目总结