- 浏览: 203493 次
- 性别:
- 来自: 芜湖
文章分类
- 全部博客 (139)
- 软件 (0)
- Pattern (6)
- CSDN导入 (19)
- Struts (3)
- [网站分类]1.网站首页原创 (27)
- [网站分类]6.转载区 (4)
- Hibernate (10)
- Error (8)
- [网站分类]2.Java新手区 (20)
- Java (8)
- [网站分类]4.其他技术区 (10)
- Web (1)
- C++ (2)
- Algorithm (4)
- Linux (2)
- Skill (1)
- Tech (2)
- Note (2)
- [网站分类]3.非技术区 (1)
- Database (1)
- Winty (7)
- [网站分类]1.网站首页原创Java技术区(对首页文章的要求: 原创、高质量、经过认真思考并精心写作。BlogJava管理团队会对首页的文章进行管理。) (0)
最新评论
-
haohao-xuexi02:
很不错哦。
O'Reilly cos上传组件的使用(1/3) - 上传文件 -
yoin528:
useUnicode=true&charact ...
[原]向MySQL数据库插入Blob数据的问题 -
xiaoqing20:
下载来看看!呵呵
[原]Struts2类型转换 -
xiaoqing20:
[原]Struts2类型转换
[标题]:[原]Struts2-文件上传与下载
[时间]:2009-8-7
[摘要]:Struts FileUpload & Download
[关键字]:浪曦视频,Struts2应用开发系列,WebWork,Apache,上传,下载,upload,download,commons
[环境]:struts-2.1.6、JDK6、MyEclipse7、Tomcat6
[作者]:Winty (wintys@gmail.com) http://www.blogjava.net/wintys
[正文]:
1、Apache Commons
Struts文件上传下载使用commons-fileupload与commons-io,struts-2.1.6中已有commons-fileupload-1.2.1.jar与commons-io-1.3.2.jar。其源代码下载地址分别为:
http://commons.apache.org/fileupload/
http://commons.apache.org/io/
2、文件上传
a.Servlet文件上传原理
此时,应将web.xml中的Struts filter注释掉,不然会导致错误。
/StrutsHelloWorld/WebRoot/upload/upload.jsp主要内容:
<form name="upload"
action="uploadServlet"
method="post"
enctype="multipart/form-data" >
用户名:<input type="text" name="user" /><br/>
附件:<input type="file" name="attachment"/><br/>
<input type="submit" name="submit" value="提交"/>
</form>
......
文件上传,需要设置method="post",enctype="multipart/form-data"。enctype默认值为:application/x-www-form-urlencoded。
服务器端接收,并将原始信息输出。
/StrutsHelloWorld/src/wintys/struts2/upload/UploadServlet.java:
import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet文件上传原理示例
*
* @author Winty (wintys@gmail.com)
* @version 2009-8-1
* @see http://wintys.blogjava.net
*/
public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = -8676112500347837364L;
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("UploadServlet...");
InputStream input = request.getInputStream();
BufferedInputStream bis = new BufferedInputStream(input);
String upfile = "c:/UploadedFile.txt";
OutputStream os = new FileOutputStream(upfile);
BufferedOutputStream bos = new BufferedOutputStream(os);
final int bytesReaded = 128;
byte[] buf = new byte[bytesReaded];
int len = -1;
while( (len = bis.read(buf, 0, bytesReaded)) != -1){
bos.write(buf, 0, len);
}
bis.close();
bos.close();
response.setContentType("text/html;charset=GBK");
PrintWriter out = response.getWriter();
out.println("上传完成!存放于:" + upfile);
out.close();
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doPost(req , resp);
}
}
在web.xml中的配置:
<servlet>
<servlet-name>UploadServlet</servlet-name>
<servlet-class>wintys.struts2.upload.UploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UploadServlet</servlet-name>
<url-pattern>/upload/uploadServlet</url-pattern>
</servlet-mapping>
b.使用apache commons上传文件
/StrutsHelloWorld/WebRoot/upload/commonsUpload.jsp:
<form name="upload"
action="commonsUploadServlet"
method="post"
enctype="multipart/form-data">
用户名:<input type="text" name="user" /><br/>
附件:<input type="file" name="attachment"/><br/>
<input type="submit" name="submit" value="提交"/>
</form>
......
/StrutsHelloWorld/src/wintys/struts2/upload/CommonsUploadServlet.java:
import java.io.*;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
/**
* 使用Apache Commons FileUpload 上传单个文件
*
* @author Winty (wintys@gmail.com)
* @version 2009-8-5
* @see http://wintys.blogjava.net
*/
@SuppressWarnings("serial")
public class CommonsUploadServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request , response);
}
@SuppressWarnings("unchecked")
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//构造FileItemFactory工厂
int sizeThreshold = 1024;
File repository = new File("c:/upload/temp");
repository.mkdirs();
FileItemFactory factory = new DiskFileItemFactory (sizeThreshold,repository);
//解析上传表单
ServletFileUpload upload = new ServletFileUpload(factory);
List<FileItem> items = null;
try {
items = upload.parseRequest (request);
} catch (FileUploadException e) {
System.err.println(e.getMessage());
e.printStackTrace();
}
//分别处理简单表单和文件
for(FileItem item : items){
String name = item.getFieldName();
String value = null;
if(item.isFormField() ){
//获取简单表单项的内容
value = item.getString("GBK");
}
else{
//获取上传文件的原始名
value = item.getName();
//如果有包含路径,则去掉
int slashIndex = -1;
if((slashIndex = value.lastIndexOf('/')) != -1
|| (slashIndex = value.lastIndexOf('""')) != -1){
value = value.substring(slashIndex + 1);
}
//写文件
File parent = new File("c:/upload");
parent.mkdirs();
File fileStore = new File(parent , value);
try {
item.write (fileStore);
} catch (Exception e) {
e.printStackTrace();
}
}
request.setAttribute(name, value);
}
request.getRequestDispatcher("/upload/result.jsp")
.forward(request, response);
}
}
FileItem.isFormField()表示是否为file或简单表单项。
在web.xml中的配置:
<servlet-name>CommonsUploadServlet</servlet-name>
<servlet-class>wintys.struts2.upload.CommonsUploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CommonsUploadServlet</servlet-name>
<url-pattern>/upload/commonsUploadServlet</url-pattern>
</servlet-mapping>
c.Struts文件上传
/StrutsHelloWorld/WebRoot/upload/strutsUpload.jsp :
<s:fielderror></s:fielderror>
<form name="upload"
action="strutsUpload"
method="post"
enctype="multipart/form-data">
用户名:<input type="text" name="user" /><br/>
附件:<input type="file " name="attachment "/><br/>
<input type="submit" name="submit" value="提交"/>
</form>
......
/StrutsHelloWorld/src/wintys/struts2/upload/UploadAction.java:
package wintys.struts2.upload;
import com.opensymphony.xwork2.ActionSupport;
/**
* 使用Struts上传单个文件
*
* @author Winty (wintys@gmail.com)
* @version 2009-8-5
* @see http://wintys.blogjava.net
*/
@SuppressWarnings("serial")
public class UploadAction extends ActionSupport {
String user;
File attachment ;
String attachment FileName;
String attachment FileContentType;
//此处省略了getter and setter...
@Override
public String execute() throws Exception {
InputStream input = new FileInputStream(attachment );
File parent = new File("c:/upload");
parent.mkdirs();
OutputStream output
= new FileOutputStream(new File(parent , attachmentFileName));
byte[] buf = new byte[1024*10];
int len = -1;
while((len = input.read(buf)) > 0){
output.write(buf, 0, len);
}
input.close();
output.close();
return SUCCESS;
}
@Override
public void validate() {
if(attachment == null){
addFieldError("attachment", "请选择上传的文件");
}
}
}
其中,"File attachment;"与form中的name相同<input type="file" name="attachment"/>。而"attachment",又决定了attachmentFileName、attachmentFileContentType的名称。
/StrutsHelloWorld/WebRoot/upload/strutsResult.jsp:
user: ${ requestScope.user } <br/>
attachment: <br/>
${ requestScope.attachmentFileName }<BR/>
在struts.xml中的配置:
<result name="success">/upload/strutsResult.jsp</result>
<result name="input">/upload/strutsUpload.jsp</result>
</action>
d.上传固定数量的文件
/StrutsHelloWorld/WebRoot/upload/strutsMultiFileUpload.jsp:
<s:fielderror></s:fielderror>
<form name="upload"
action="strutsMultiFileUpload"
method="post"
enctype="multipart/form-data">
用户名:<input type="text" name="user" /><br/>
附件1:<input type="file" name="attachment"/><br/>
附件2:<input type="file" name="attachment"/><br/>
附件3:<input type="file" name="attachment"/><br/>
<input type="submit" name="submit" value="提交"/>
</form>
......
/StrutsHelloWorld/src/wintys/struts2/upload/MultiFileUploadAction.java
:
import java.io.*;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.opensymphony.xwork2.ActionSupport;
/**
*
* @author Winty (wintys@gmail.com)
* @version 2009-8-6
* @see http://wintys.blogjava.net
*/
@SuppressWarnings("serial")
public class MultiFileUploadAction extends ActionSupport {
String user;
List<File> attachment;
List<String> attachmentFileName;
List<String> attachmentFileContentType;
//此处省略了getter and setter...
@Override
public String execute() throws Exception {
for(int i = 0 ; i < attachment.size(); i++){
File attach = attachment.get(i);
InputStream input = new FileInputStream(attach);
File parent = new File("c:/upload");
parent.mkdirs();
File out = new File(parent , attachmentFileName.get(i));
OutputStream output = new FileOutputStream(out);
byte[] buf = new byte[1024];
int len = -1;
while((len = input.read(buf)) > 0){
output.write(buf, 0, len);
}
input.close();
output.close();
}
return SUCCESS;
}
@Override
public void validate() {
if(attachment == null){
addFieldError("attachment", "请选择文件");
}
}
/**
* 当上传文件大小大于struts.multipart.maxSize提示时,
* 客户端会出现如下错误:
* "the request was rejected because its size (4501994)
* exceeds the configured maximum (2097152)"。
* 此信息在commons-fileupload.jar,
* org.apache.commons.fileupload.FileUploadBase源代码中第904行。
*
* 重写addActionError()以替换默认信息。
*/
@Override
public void addActionError(String anErrorMessage) {
//这里要先判断一下,是我们要替换的错误,才处理
if (anErrorMessage.startsWith("the request was rejected because its size")) {
//这些只是将原信息中的文件大小提取出来。
Matcher m = Pattern.compile("""d+").matcher(anErrorMessage);
String s1 = "";
if (m.find()) s1 = m.group();
String s2 = "";
if (m.find()) s2 = m.group();
//偷梁换柱,将信息替换掉
super.addActionError("你上传的文件(" + s1 + ")超过允许的大小(" + s2 + ")");
} else {//不是则不管它
super.addActionError(anErrorMessage);
}
}
}
在web.xml中的配置:
<result name="success">/upload/strutsResult.jsp</result>
<result name="input">/upload/strutsMultiFileUpload.jsp</result>
</action>
e.上传任意个数文件
wintys.struts2.upload.MultiFileUploadAction不需要改变,只需要修改strutsMultiFileUpload.jsp为
/StrutsHelloWorld/WebRoot/upload/strutsMultiUpload.jsp:
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>upload</title>
</head>
<style type="text/css">
.attachLine{
border: 1px solid #00C0EE;
margin-bottom:10px;
}
.desc{
display:inline;
color:blue;
}
.attach{
display:inline;
border:1px solid #8800AA;
margin-left:30px;
}
.remove{
display: inline;
margin-left:30px;
}
</style>
<script type="text/javascript">
var attachmentCounts = 1;
function addMore(){
if(attachmentCounts >= 5){
window.alert("附件数不能大于" + 5);
return;
}
attachmentCounts++;
var attachment = document.getElementById("attachment");
var line = document.createElement("div");
line.setAttribute("class" , "attachLine");
line.setAttribute("className" , "attachLine");//for IE
//标签
var descDiv = document.createElement("div");
descDiv.setAttribute("class" , "desc");
descDiv.setAttribute("className " , "desc");//for IE
var desc = document.createTextNode("附件:");
descDiv.appendChild(desc);
line.appendChild(descDiv);
//文件上传
var attachDiv = document.createElement("div");
attachDiv.setAttribute("class" , "attach");
attachDiv.setAttribute("className" , "attach");//for IE
var attach = document.createElement("input");
attach.setAttribute("type" , "file");
attach.setAttribute("name" , "attachment");
attachDiv.appendChild(attach);
line.appendChild(attachDiv);
//移除
var removeDiv = document.createElement("div");
removeDiv.setAttribute("class" , "remove");
removeDiv.setAttribute("className" , "remove");//for IE
var remove = document.createElement("input");
remove.setAttribute("type" , "button");
remove.setAttribute("value" , "移除");
remove.onclick = function removeLine(){
attachmentCounts--;
attachment.removeChild(line);
}
removeDiv.appendChild(remove);
line.appendChild(removeDiv);
attachment.appendChild(line);
}
</script>
<body>
<s:actionerror/>
<s:fielderror></s:fielderror>
<form name="upload"
action="strutsMultiUpload"
method="post"
enctype="multipart/form-data">
用户名:<input type="text" name="user" /><br/>
<div id="attachment" >
<div>
<input type="button" value="增加附件个数" onclick="addMore() ;"/>
</div>
<div class="attachLine">
<div class="desc">附件:</div>
<div class="attach"><input type="file" name="attachment"/></div>
</div>
</div>
<input type="submit" name="submit" value="提交" />
</form>
</body>
</html>
在struts.xml中的配置:
<result name="success">/upload/strutsResult.jsp</result>
<result name="input">/upload/strutsMultiUpload.jsp</result>
</action>
f.文件上传相关配置
给文件上传拦截器fileUpload配置参数,在struts.xml中:
<interceptor name="myUploadInterceptor" class="wintys.struts2.upload.MyFileUploadInterceptor" />
<interceptor-stack name="myUploadStack">
<interceptor-ref name="fileUpload ">
<param name="maximumSize">204800</param>
<param name="allowedTypes">
image/jpeg,image/pjpeg,text/plain,application/vnd.ms-powerpoint
</param>
<param name="allowedExtensions">txt,jpg</param>
</interceptor-ref>
<interceptor-ref name="myUploadInterceptor " />
<interceptor-ref name="basicStack"/>
<interceptor-ref name="validation"/>
<interceptor-ref name="workflow"/>
</interceptor-stack>
......
<action name="strutsMultiUpload" class="wintys.struts2.upload.MultiFileUploadAction">
<result name="success">/upload/strutsResult.jsp</result>
<result name="input">/upload/strutsMultiUpload.jsp</result>
<interceptor-ref name="myUploadStack"></interceptor-ref>
</action>
说明:
a).allowedTypes:可以从tomcat/conf/web.xml中查得minetype。
b).myUploadInterceptor: 自定义拦截器。对Struts fileUpload进行拦截,如果上传文件中出现错误,就直接返回到Action.INPUT;如果没有错误,则继续执行。
c).validation: 进行校验。
d).workflow: 保证validation中添加错误后,不再执行execute()。
如果不加myUploadInterceptor,会出现上传过大文件,给客户端提示出错信息后,还继续执行validate()方法。参照FileUploadInterceptor源代码,得到以下解决方案。
myUploadInterceptor=>wintys.struts2.upload.MyFileUploadInterceptor :
/StrutsHelloWorld/src/wintys/struts2/upload/MyFileUploadInterceptor.java
:
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.ValidationAware;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
/**
* 用于对Struts默认文件上传拦截器(FileUploadInterceptor)进行处理,
* 如果上传文件中出现错误,就直接返回到Action.INPUT;
* 没有错误,则继续执行。
*
* 配置如下:
* <interceptor name="myUploadInterceptor" class="wintys.struts2.upload.MyFileUploadInterceptor" />
* <interceptor-stack name="myUploadStack">
* <interceptor-ref name="fileUpload">
* <param name="maximumSize">204800</param>
* <param name="allowedTypes">
* image/jpeg,image/pjpeg,text/plain,application/vnd.ms-powerpoint
* </param>
* <param name="allowedExtensions">txt,jpg</param>
* </interceptor-ref>
* <interceptor-ref name="myUploadInterceptor" />
* <interceptor-ref name="basicStack"/>
* <interceptor-ref name="validation"/>
* <interceptor-ref name="workflow"/>
* </interceptor-stack>
* @author Winty (wintys@gmail.com)
* @version 2009-8-7
* @see http://wintys.blogjava.net
*/
@SuppressWarnings("serial")
public class MyFileUploadInterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation invocation) throws Exception {
ValidationAware validation = null;
Object action = invocation.getAction();
if (action instanceof ValidationAware) {
validation = (ValidationAware) action;
}
//如果上传文件中出现错误,就直接返回到INPUT;没有错误,则继续执行
String result = Action.INPUT;
if(validation == null || !validation.hasErrors())
result = invocation.invoke();
return result;
}
}
struts2-core-2.1.6.jar/org.apache.struts2/struts-message.properties定义了原始的提示信息。重定义提示信息,新建/StrutsHelloWorld/src/message.properties(与struts.xml相同目录):
struts.messages.error.file.too.large=文件过大:{1}
struts.messages.error.content.type.not.allowed=文件类型不允许:{1}
struts.messages.error.uploading=文件上传失败:发生内部错误
struts2-core-2.1.6.jar/org.apache.struts2/default.properties中定义了默认配置。自己改变配置默认(编码等),在struts.xml中:
<!-- 上传文件临时存放地 -->
<constant name="struts.multipart.saveDir" value="c:/upload/temp"></constant>
<!-- 默认编码:不配置中文会出现乱码 -->
<constant name="struts.i18n.encoding" value="GBK"></constant>
<!-- 总的文件大小:about 2M -->
<constant name="struts.multipart.maxSize " value="2097152"></constant>
......
g.注意问题
文件过大的提示信息:
当文件大小<maximumSize,正常上传。
当maximumSize < 文件大小 < struts.multipart.maxSize提示struts.messages.error.file.too.large。
当文件大小>struts.multipart.maxSize提示:
"the request was rejected because its size (4501994) exceeds the configured maximum (2097152)
"。
"the request was rejected..."这个信息是写死在代码中的(commons-fileupload-1.2.1.jar/org.apache.commons.fileupload.FileUploadBase 第902行),没有做国际化,所以必须另外对待。直接修改FileUploadBase代码中的字符串,或override com.opensymphony.xwork2.ActionSupport.addActionError()。override addActionError()代码见/StrutsHelloWorld/src/wintys/struts2/upload/MultiFileUploadAction.java
。
3、文件下载
/StrutsHelloWorld/WebRoot/upload/fileDownload.jsp:
......
<s:a href="strutsFileDownload.action" >点击这里下载文件</s:a>
......
/StrutsHelloWorld/src/wintys/struts2/upload/DownloadAction.java
import java.io.*;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
@SuppressWarnings("serial")
public class DownloadAction extends ActionSupport {
public InputStream getDownloadFile() {
String filepath = "/upload/fordownloadtest.ppt";
InputStream is = ServletActionContext .getServletContext()
.getResourceAsStream(filepath);
return is;
}
/**
* struts.xml中配置如下:
* <param name="contentDisposition">
* attachment;filename="${fileName}"
* </param>
*
* ${fileName}:表明需要在DownloadAction中提供getFileName()方法。
*
* @return 下载文件的文件名
*/
public String getFileName(){
String filename = "Test下载测试文件.ppt";
String fn = "test.ppt";
try {
fn =new String(filename.getBytes() , "ISO8859-1 ");
} catch (UnsupportedEncodingException e) {
fn = "error.ppt";
e.printStackTrace();
}
return fn;
}
@Override
public String execute() throws Exception {
return SUCCESS;
}
}
在struts.xml中的配置:
<result name="success" type="stream"><!--type为stream,使用StreamResult处理-->
<param name="contentType">application/octet-stream</param>
<param name="inputName">downloadFile</param>
<param name="contentDisposition">attachment;filename="${fileName} "</param>
</result>
</action>
说明:
a).inputName=downloadFile,指明DownloadAction中public InputStream getDownloadFile()返回文件流。
b).type="stream",说明使用org.apache.dispatcher.StreamResult处理这个result。
c).contentDisposition、contentType等属性可以在<param>里配置,也可以在DownloadAction中直接提供getter。
[参考资料]:
[1] 《浪曦视频之Struts2应用开发系列》
[2] 谈谈我对Struts2文件上传的理解 : http://www.iteye.com/topic/287800
[3] Struts2中文件上传错误提示信息the request was rejected because its size的解决办法 : http://www.blogjava.net/cmzy/archive/2009/04/15/265703.html
[4] 理解和灵活应用 Struts2 的文件下载功能 : http://www.blogjava.net/Unmi/archive/2009/06/17/282780.html
[附件]:
源代码 :
Struts_FileUpload_Download.zip
- Struts_FileUpload_Download.zip (14.1 KB)
- 下载次数: 30
发表评论
-
[原]MyEclipse location already exists
2009-07-27 00:37 1746[标题]:[原]MyEclipse location alre ... -
[原]Exception starting filter MyStruts2
2009-07-27 19:41 1067[标题]:[原]Exception starting filt ... -
[原]Struts2校验框架
2009-07-27 23:54 1139[标题]:[原]Struts2校验框架 [时间]:2009- ... -
[原]Struts2-拦截器
2009-08-01 00:21 1170[标题]:[原]Struts2-拦截器 [时间]:2009- ... -
[原]Struts2-国际化
2009-08-10 18:13 1913[标题]:[原]Struts2-国际化 [时间]:2009- ... -
[原]Struts2-深入探索
2009-08-29 20:32 1083[标题]:[原]Struts2-深入探索 [时间]:2009 ... -
[原]Struts2-整合JFreeChart
2009-09-03 17:10 1924[标题]:[原]Struts2-整合JFr ... -
[转]Java 小例子:数据持久化(保存数据到文件)
2009-03-16 11:00 1783说数据持久化,初学者可能还不太懂;但要说把数据保存到文件,这谁 ... -
[原]调试EL函数时,Tomcat提示NullPointerException
2009-04-03 19:02 943[标题]:调试EL函数时,Tomcat提示NullPointe ... -
[原]HelloWorldServlet
2009-05-27 22:16 949编译运行步骤: 1、将HelloWorldServlet.ja ... -
[原]getServletInfo()
2009-05-27 23:16 1405《JSP完全学习手册》学习心得之:getServletInfo ... -
[原]jsp:forward
2009-05-27 23:24 934《JSP完全学习手册》学习心得:jsp:forward Jud ... -
[原]jsp:param
2009-05-27 23:27 1620《JSP完全学习手册》学习心得:jsp:param param ... -
[原]request.getParameterValues()
2009-05-27 23:32 1243《JSP完全学习手册》学习心得:request.getPara ... -
[原]隐含对象config
2009-05-27 23:54 770《JSP完全学习手册》学习心得:隐含对象config < ... -
[原]cookie读写
2009-05-28 00:03 869《JSP完全学习手册》学习心得:cookie读写 <%@ ... -
[原]getHttpHeader
2009-05-28 00:14 860《JSP完全学习手册》学习心得:getHttpHeader g ... -
[原]向MySQL数据库插入Blob数据的问题
2009-06-03 23:45 3999[标题]:向MySQL数据库插 ... -
[原]SQL内外连接
2009-06-17 22:31 930-- Author:Winty(天堂露珠) -- Date: ...
相关推荐
该漏洞是由于 Struts2 中的 MultiPartRequestWrapper 类中的一个错误导致的,该错误可能会导致攻击者可以上传恶意文件,进而导致服务器崩溃或数据泄露。 修补方法 为了修复 S2-045 漏洞,我们可以采取以下步骤: 1...
需求 1.能够对多个文件进行上传(可以选择上传文件个...提供多文件上传,上传成功后,提供刚上传的文件下载功能(其他的都可以在其上面进行扩充) 多文件 上传 下载 随意文件 java Struts2 单例 配置 动态读取 李顺利
Struts2是一个强大的Java web框架,它为开发者提供了丰富的功能,包括文件上传和下载。在Struts2中处理文件上传和下载是常见的需求,对于构建交互式的Web应用来说至关重要。以下将详细介绍Struts2中如何实现这两个...
1. **.struts2配置**:在Struts2框架中,需要在`struts.xml`配置文件中添加相应的action配置,声明文件上传的处理方法。通常,你需要设置`<result>`类型为`stream`,以便处理上传的文件。 2. **Action类**:创建一...
**文件上传下载**:在Struts2中,可以使用FileUpload插件来处理文件上传,而文件下载可以通过设置响应头和输出流来实现。Spring MVC也有类似的MultipartFile接口用于处理文件上传。 **用户管理**:SSH框架提供了...
本文详细介绍了如何在Struts2环境下实现多文件上传与下载的功能,包括配置文件的动态读取、上传路径的配置、文件上传与下载的具体实现等。通过本项目的实践,开发者可以更好地理解和掌握Struts2框架下的文件操作技术...
1.struts2 带进度条文件上传 源码 2.源码中有lib 下载后部署马上就能用 3.代码中有详细的注释信息 4.对关键点有详细的解释说明 5.如果谁用起来觉得有问题可在评论留言,留联系方式,我会联系你的 6.非常感谢原创作者...
Struts AJAX 文件上传是一种在Java Web开发中实现异步数据传输的技术,它结合了Struts框架和AJAX(Asynchronous JavaScript and XML)的优势,提供了一种用户友好的、无刷新的文件上传方式。这种方式可以显著提升...
##### 4.2 文件上传与下载 文件上传是Web应用中常见的一项功能,Struts2提供了简单易用的方式来实现这一需求。 ##### 4.3 高级表单处理技巧 在表单处理方面,Struts2支持多种高级技巧,如自动填充表单字段、动态...
总的来说,实现Struts1文件上传带进度条的功能,需要前端与后端的紧密配合,利用现代浏览器的API,以及对Struts1框架的深入理解。这不仅可以提升用户体验,也是技术能力的一种体现。在实际开发中,我们还需要考虑...
在"struts2上传下载+前端剪切图片"这个主题中,我们将探讨Struts2框架如何处理文件上传和下载功能,以及如何在前端实现图片的剪切操作。 **文件上传**: 在Struts2中,文件上传主要依赖于Apache的Commons ...
首先,为了进行文件上传,我们需要在Struts2的配置文件(通常为struts.xml)中启用文件上传拦截器。这可以通过添加以下配置实现: ```xml <interceptor name="fileUpload" class="org.apache.struts2.interceptor...
至此,我们已经完成了Struts2框架下多文件上传与下载的基本实现。 在实际项目中,还需要考虑其他因素,如文件大小限制、文件类型检查、异常处理、安全问题(防止路径遍历攻击等)以及用户体验优化(例如显示上传...
Struts2提供了强大的文件上传支持,主要依赖于Apache的Commons FileUpload库。要实现文件上传,首先需要在Struts2配置中启用它,然后在Action类中定义一个`List<File>`或`File`类型的属性来接收上传的文件。用户...
以下是一些关于Struts文件上传的关键知识点: 1. **配置文件**: - 首先,我们需要在Struts的配置文件(如struts-config.xml)中配置ActionForm,声明一个继承自`org.apache.struts.upload.FormFile`的字段,用于...
Struts2+hibernate+spring实现多文件的上传与下载功能,主要包括:上传、下载、删除 1.能够对多个文件进行上传(可以选择上传文件个数,也即上传文件个数不定) 2.Struts2进行下载处理,能对上传的所有文件进行...
总结来说,"Struts2+ajax+json异步上传图片回显"是一个综合运用前端与后端技术的实践,它涉及到Struts2的文件上传处理、Ajax的异步通信以及JSON数据的交互,为用户提供了一个流畅的图片上传体验。
Struts2提供了`struts2-convention-plugin`和`struts2-file-uploading-plugin`等插件来支持文件上传。主要涉及`Action`类中的`@FileUpload`注解和`CommonsFileUpload`库。你需要在配置文件中启用文件上传,如`...
本实例将向你展示如何利用Struts2的FileUpload拦截器处理图片上传,并通过Java图像处理库如Java AWT或Apache Commons Imaging(原ImageIO)来创建缩略图。 首先,我们需要在Struts2的配置文件`struts.xml`中添加`...