总结的两个问题,就是struts2上传下载的时候对属性名配置要求非常严格:

第一:上传的时候

private File file;

private String fileContentType;

private String fileFileName;

属性的红色部分必须有可以随意起,但不能省略。

第二:下载的时候属性名不能随意起。

实现文件上传:可以找到WEB-INF\lib\struts2-core-2.3.16.3.jar下的struts-default.xml里的拦截器标签下的name=fileUpload的实体类alt+shift+t进去源代码(前提是关联好jar包),看看

我的上传Action:

package cn.jbit.action;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.InputStream;

import java.io.OutputStream;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class UploadAction extends ActionSupport {

//Action中使用了3个属性来封装文件信息

//1:File类型的xxx属性:与表单中的File控件的name属性一致,用于封装File控件对应的文件内容

//2:String类型的xxxFileName属性和3:String类型的xxxContentType属性,这两个属性的固定语法是

//File类型的属性名+后缀FileName|ContentType组合成最终:xxxFileName,xxxContentType

//如果不按固定语法写的话,可能会造成文件名和文件类型读取不到的情况,最终写入的文件是一个

//名字为:null,并且没有类型格式的文件信息。(虽然手动改成.jpg也会显示) private File file;

private String fileContentType;

private String fileFileName;

@Override

public String execute() throws Exception {

//1024*1024=1M

byte[] buffer=new byte[1024*1024];

//表单里的file标签

InputStream fis=new FileInputStream(file);

//在WebRoot目录下创建一个存放图片的文件夹,然后获取真实的地址

String path=ServletActionContext.getServletContext().getRealPath("image");

path=path+"\\"+this.fileFileName;

System.out.println(path);

//最终把读到的二进制流都写入,真实地址下同名的文件里

OutputStream os=new FileOutputStream(path);

//OutputStream os=new FileOutputStream("E:\\upload\\"+this.fileFileName);

int len=0;

while((len=fis.read(buffer))>0){

os.write(buffer,0,len);

}

fis.close();

os.close();

return SUCCESS;

}

public File getFile() {

return file;

}

public void setFile(File file) {

this.file = file;

}

public String getFileContentType() {

return fileContentType;

}

public void setFileContentType(String fileContentType) {

this.fileContentType = fileContentType;

}

public String getFileFileName() {

return fileFileName;

}

public void setFileFileName(String fileFileName) {

this.fileFileName = fileFileName;

}

}

上传完之后,切记就是此时如果你在WebRoot下右键打开image→MyEclipse→open in Explorer是找不到你上传的图片的,因为图片真实的存储地址是在项目部署的地方webapps里如:E:\Program Files (x86)\apache-tomcat-7.0.55\webapps\up\image而不是这个路径:E:\java2\upload2014年12月2日\WebRoot\image。

上传文件的表单:

<body>

<s:form action="upload" enctype="multipart/form-data" method="post">

<s:file name="file" label="选择文件"></s:file>

<s:submit value="上传"></s:submit>

</s:form>

</body>

成功后跳转的页面:

您所上传的文件是:<s:property value="fileFileName"/><br/>

文件类型:<s:property value="fileContentType"/><br/>。

上传多个文件的话:

我们在WEB-INF\lib\struts2-core-2.3.16.3.jar下的org.apache.struts2下的default.properties里搜索max能看到:

struts.multipart.maxSize=2097152

也就是struts2里给的默认上传大小是2M(上传多个文件总大小),那么我们可以在struts2.xml里面设置大点:

//20M

<constant name="struts.multipart.maxSize" value="20971520"/>

我的上传表单为:

<s:form action="upload" enctype="multipart/form-data" method="post">

<s:file name="files" label="选择文件"></s:file>

<s:file name="files" label="选择文件"></s:file>

<s:file name="files" label="选择文件"></s:file>

<s:file name="files" label="选择文件"></s:file>

<s:file name="files" label="选择文件"></s:file>

<s:file name="files" label="选择文件"></s:file>

<s:submit value="上传"></s:submit>

我的上传Action:

package cn.jbit.action;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.InputStream;

import java.io.OutputStream;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class UploadAction extends ActionSupport {

private static final long serialVersionUID = 1L;

private File[] files;

private String[] filesContentType;

private String[] filesFileName;

@Override

public String execute() throws Exception {

byte[] buffer=new byte[1024*1024];

files=getFiles();

for (int i = 0; i < files.length; i++) {

//表单里的file标签

InputStream fis=new FileInputStream(files[i]);

//在WebRoot目录下创建一个存放图片的文件夹,然后获取真实的地址

String path=ServletActionContext.getServletContext().getRealPath("image");

path=path+"\\"+this.filesFileName[i];

System.out.println(path);

//最终把读到的二进制流都写入,真实地址下同名的文件里

OutputStream os=new FileOutputStream(path);

int len=0;

while((len=fis.read(buffer))>0){

os.write(buffer,0,len);

}

fis.close();

os.close();

}

return SUCCESS;

}

public File[] getFiles() {

return files;

}

public void setFiles(File[] files) {

this.files = files;

}

public String[] getFilesContentType() {

return filesContentType;

}

public void setFilesContentType(String[] filesContentType) {

this.filesContentType = filesContentType;

}

public String[] getFilesFileName() {

return filesFileName;

}

public void setFilesFileName(String[] filesFileName) {

this.filesFileName = filesFileName;

}

}

实现文件下载:

我的Action:

package cn.jbit.action;

import java.io.BufferedInputStream;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.InputStream;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class FileDownAction extends ActionSupport {

//struts2对属性名的配置很严格,如果不正确是会报错的,我在这里犯了个错

//把private InputStream InputStream ;声明成了InputStream input;

//就给我报错说找不到inputStream,所以建议 //fileName,contentType,inputStream属性名不要自己随便起名。

对常用的属性名来说比如

//读取下载文件的目录

private String path;

//下载文件的文件名

private String fileName;

//下载文件的类型

private String contentType;

//读取下载文件的输入流

private InputStream inputStream;

@Override

public String execute() throws Exception {

return SUCCESS;

}

public String getFileName() {

return fileName;

}

public void setFileName(String fileName) {

this.fileName = fileName;

}

public String getContentType() {

return contentType;

}

public void setContentType(String contentType) {

this.contentType = contentType;

}

public InputStream getInputStream() throws FileNotFoundException {

String paths=ServletActionContext.getServletContext().getRealPath(path);

return new BufferedInputStream(new FileInputStream(paths+"\\"+fileName));

}

public void setInputStream(InputStream inputStream) {

this.inputStream = inputStream;

}

public String getPath() {

return path;

}

public void setPath(String path) {

this.path = path;

}

}

我的struts.xml配置:

<action name="download" class="cn.jbit.action.FileDownAction" >

<param name="path">/image</param>

<result name="success" type="stream">

<!-- 找到发布服务器Tomcat下→conf→web.xml里有各种各样的mime类型 -->

<!-- mime:多用途互联网邮件扩展类型,是设定某种扩展名的文件用一种应用程序来打开的方式类型 -->

<param name="contentType">image/jpeg</param>

<param name="fileName">input</param>

<param name="contentDisposition">

<!-- contentDisposition参数由两部分组成,前面的部分标识处理文件的形式,如attachment表示在下载时弹出对话框,提示用户保存或者直接打开该文件;

后一部分标识下载文件的文件名称,量部分之间以分号进行分割 -->

attachment;filename="${fileName}"

</param>

<!-- 设置 下载时缓存区的大小,由于是从服务器里下载,建议不要设置太大 -->

<param name="bufferSize">4096</param>

</result>

</action>

我的down.jsp:

<a href="download.action?fileName=Hydrangeas.jpg">点击此处下载文档</a>

struts2实现文件上传、多文件上传和文件下载的更多相关文章

  1. struts2实现文件上传(多文件上传)及下载

    一.要实现文件上传,需在项目中添加两个jar文件 二.上传准备的页面 注:必须植入enctype="multipart/form-data"属性,以及提交方式要设置成post &l ...

  2. struts2 s:file标签使用及文件上传例子

      <s:form action="uploadaction" method="post" enctype="multipart/form-da ...

  3. ueditor1.3.6jsp版在struts2应用中上传图片报"未找到上传文件"解决方案

    摘要: ueditor1.3.6jsp版在struts2应用中上传图片报"未找到上传文件"解决方案 在struts2应用中使用ueditor富文本编辑器上传图片或者附件时,即使配置 ...

  4. Struts2 单个文件上传/多文件上传

    1导入struts2-blank.war所有jar包:\struts-2.3.4\apps\struts2-blank.war 单个文件上传 upload.jsp <s:form action= ...

  5. struts2文件上传,文件类型 allowedTypes

    struts2文件上传,文件类型 allowedTypes 1 '.a' : 'application/octet-stream', 2 '.ai' : 'application/postscript ...

  6. struts2.1.6教程九、文件上传下载(了解)

    首先建立struts2UpDownLoad项目,搭建好struts2基本的开发环境. 上传实例 步骤一:upload.jsp代码如下: <s:form action="upload&q ...

  7. Struts2文件上传--多文件上传(插件uploadify)

    公司需要把以前的Struts2自带的图片上传替换掉,因为不能一个file选择多个文件,本人直接百度搜索图片插件,  貌似就它(uploadify3.2.1)在最前面,也找过很多案例, 其中有不少问题, ...

  8. struts2 上传下载文件,异常处理,数据类型转换

    一,web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version=" ...

  9. Struts2之文件上传(单文件/多文件)

    <一>简述: Struts2的文件上传其实也是通过拦截器来实现的,只是该拦截器定义为默认拦截器了,所以不用自己去手工配置,<interceptor name="fileUp ...

  10. struts2文件上传时获取上传文件的大小

    利用struts2框架上传文件时,如果想要获取上传文件的大小可以利用下面的方式进行: FileInputStream ins = new FileInputStream(file); if (ins. ...

随机推荐

  1. There was an internal API error.

    1.一开始以为是用了 iOS8的API, 抱着不相信的态度,我搜到了一条原因,可能是没有选择对开发者账号或需要 cmd+shift+k 来 clean 一下,无效. 2.又继续盯着这个问题,才发现我的 ...

  2. Maven with Multi-module

    Well, A project made of multi modules. For example, the hongten-security project, the structure of t ...

  3. iOS9 升级XCode7遇到的问题收集

    开发环境运行      各位可能会觉得,笔者在此还要讲开发环境的运行,是不是多此一举.其实并非如此,综合笔者这几年iOS开发经验的总结,运行新版本,特别是测试版本的Xcode是一个需要格外小心的事情, ...

  4. Linux多线程实例练习 - pthread_create()

    Linux多线程实例练习 pthread_create():创建一个线程 int pthread_create(pthread_t *tidp, const pthread_attr_t *attr, ...

  5. osgearth_city例子总结

    osgearth_city例子总结 转自:http://blog.csdn.net/taor1/article/details/8242480 int main(int argc, char** ar ...

  6. javamail 收邮件并解析附件

    package com.zz.mail; import java.io.*; import java.text.*; import java.util.*; import javax.mail.*; ...

  7. 关于iOS多线程的总结

    关于iOS多线程的总结   在这篇文章中,我将为你整理一下 iOS 开发中几种多线程方案,以及其使用方法和注意事项.当然也会给出几种多线程的案例,在实际使用中感受它们的区别.还有一点需要说明的是,这篇 ...

  8. scroll、offset和client的区别

    整体布局: <!DOCTYPE> <head> <meta http-equiv="Content-Type" content="text/ ...

  9. 关于VS打包程序无法弹出主界面的问题

    代码中的程序很正常,VS打包之后,无法弹出主界面的问题. 这种问题,一般是缺少程序加载所必须的东西,包括dll,配置文件等. (1)程序主界面使用的是DevExpress,DevExpress的相关类 ...

  10. C++对析构函数的误解(转)

    C++析构前言 析构函数在什么时候会自动被调用,在什么时候需要手动来调用,真不好意思说偶学过C++…今日特此拨乱反正. C++析构误解正文 对象在构造的时候系统会分配内存资源,对一些数据成员进行初始化 ...