- 浏览: 541297 次
- 性别:
- 来自: 西安
文章分类
- 全部博客 (233)
- 设计模式 (1)
- WEBLOGIC (2)
- spring (2)
- struts (1)
- hibernate (8)
- SOA (11)
- j2ee (0)
- corba (0)
- linux (2)
- oracle (0)
- webService (17)
- javaMail (1)
- junit (3)
- java (45)
- 正则表达式 (7)
- java+xml (4)
- html (2)
- javaScript (6)
- ajax (1)
- mysql (0)
- eclipse (2)
- eclipse插件开发 (3)
- 软件工程 (5)
- ant (6)
- 开源包 (6)
- 学习网站 (7)
- Struts2 (18)
- JSP (1)
- 持续集成 (4)
- FreeMaker (6)
- 工作项目点点 (4)
- Maven2 (6)
- JQuery (1)
- 日志记录 (9)
- 工作流 (4)
- BPEL (1)
- extJs (1)
- 组件 (1)
- OSGI (10)
- ESB总线学习 (1)
- 错误解决 (2)
- JMX (3)
- 网络知识 (1)
最新评论
-
duanlongk:
这个问题解决了么?
java.lang.NoClassDefFoundError: org/apache/tuscany -
sotrip:
从上面结果来看,HelloWorld.class是由虚拟机的内 ...
如何实现自己的classloader -
zengsir2008:
哎,不太明白。。。。
OSGI DS 实例 -
ralfsumahe:
...
使用XFire开发Web Service客户端完整入门教程 -
liuqiao_0702:
...
osgi spring hibernate =
文件上传的原理:
表单元素的enctype属性指定的是表单数据的编码方式,该属性有3个值:
1) application/x-www-form-urlencoded:这是默认编码方式,它只处理表单域里的value属性值,采用这种编码方式的表单会将表单域的
值处理成URL编码方式。
2) multipart/form-data:这种编码方式的表单会以二进制流的方式来处理表单数据,这种编码方式会把文件域指定文件的内容也封装到
请求参数里。
3) text/plain:这种方式主要适用于直接通过表单发送邮件的方式。
文件上传是web应用经常用到的一个知识。原理是,通过为表单元素设置enctype=”multipart/form-data”属性,让表单提交的数据以二
进制编码的方式提交,在接收此请求的Servlet中用二进制流来获取内容,就可以取得上传文件的内容,从而实现文件的上传。
在Java领域中,有两个常用的文件上传项目:一个是Apache组织Jakarta的Common-FileUpload组件
(http://commons.apache.org/fileupload/),另一个是Oreilly组织的COS框架(http://www.servlets.com/cos/)。利用这两个框架都能很方便
的实现文件的上传。
==================================
Struts2上传文件
增加commons-fileupload-1.2.jar和commons-io-1.3.1.jar到lib
=====
jsp
=====
form 的 enctype 设置为 multipart/form-data
==============
UploadAction
==============
private String username;
private String password;
private File file; // 对应文件域
private String fileFileName; // 前面的File属性的名字 + FileName(固定的)
private String fileContent; // 前面的File属性的名字 + Content
// setter... getter...
String execute() throws Exception {
InputStream is = new FileInputStream( file );
String root = ServletActionContext.getRequest().getRealPath("/upload");
File destFile = new File(root,this.getFileFileName());
OutputStream os = new FileOutputStream( destFile );
byte[] buffer = new byte[400];
int length = 0;
while( (length = is.read(buffer)) > 0 ) {
os.write(buffer,0,length);
}
is.close();
os.close();
return SUCCESS;
}
=================
中文问题
=================
不过我全部用UTF-8并未遇到中文问题
struts2-core包
struts-default.xml ----拦截器的设置
org.apache.struts2.default.properties ----全局属性的设置
33行 strusts.i18n.encoding=UTF-8 默认UTF-8
可以在struts.xml下进行设置
<struts>
设置字符集
<constant name="struts.i18n.encoding" value="gbk"/>
设置上传文件缓存
<constant name="struts.multipart.saveDir" value="c:\"/>
</struts>
其他属性
struts.multipart.parser=jakarta struts2采用那种方式上传
pell
cos
struts.multipart.maxSize=2097152 默认上传文件最大的请求大小2M
struts.action.extension=action 整个url的后缀名
================
上传多个文件
================
有两种方式:
1.数组
File[] file 文件
String[] fileFileName 文件名
String[] fileContentType 文件类型
2.集合
List<File> file
List<String> fileFileName
List<String> fileContentType
--------
action中:
--------
String execute() {
for(int i = 0; i < file.size(); i++) {
InputStream is = new FileInputStream(file.get(i));
String root = ServletActionContext.getRequest().getRealPath("/upload");
File destFile = new File(root,this.getFileFileName().get(i));
...
}
return SUCCESS;
}
------
jsp中:
------
多个file时,file的名字要一致,都要叫file,它会自动set到跟file名对应的List中去
<s:file name="file" />
<s:file name="file" />
<s:file name="file" />
========================
上传任意个文件
========================
<td id="more">
<input type="button" value="添加" onclick="addMore()" />
</td>
------
JS:
------
funcation addMore() {
var td = document.getElementById("more");
//生成一个换行符
var br = document.createElement("br");
//创建一个input组件
var input = document.createElement("input");
var button = document.createElement("input");
//指定类型 为 file 为文件上传
input.type = "file";
//指定组件的名字
input.name = "file";
button.type = "button";
button.value = "删除";
//为删除按钮注册一个事件
button.onclick = function() {
//alert("删除按钮");
//删除一行
td.removeChild(br);
td.removeChild(input);
td.removeChild(button);
}
//将创建的组件加到<td>中
td.appendChild(br);
td.appendChild(input);
td.appendChild(button);
}
=======================
限制上传类型
=======================
org.apache.struts2.interceptor.FileUploadInterceptor类
Long maximumSize:最大上传大小---每一个文件的大小,不是总和
String allowedTypes:允许的类型
-------------
struts.xml
-------------
<struts>
<action ...>
<result name="input">/upload.jsp</result>
<result .../>
加入一个上传文件的拦截器并设置其属性
<interceptor-ref name="fileUpload">
<param name="maximumSize">409600</param> 单个上传文件最大不能超过400K
<param name="allowedTypes">...</param> mime类型,多个用逗号分开
</interceptor-ref>
** 加入默认的拦截器
<interceptor-ref name="defaultStack" />
</action>
</struts>
注:后缀可以到tomcat\conf\web.xml中找<mime-type>中的字符串
--------------
upload.jsp
--------------
添加<s:fielderror />
----------------------
更改显示的错误信息
----------------------
org.apache.struts2中 找到struts-messages.properties
-----------------------
上传文件类型不匹配
struts.messages.error.content.type.not.allowed=Content-Type not allowed: {0} "{1}" {2}
-----------------------
上传文件大小超出规定
struts.messages.error.file.too.large=File too large: {0} "{1}" {2}
-----------------------
上传文件出错
struts.messages.error.uploading=Error uploading: {0}
创建一个全局的属性文件 /src/messages.properties
struts.messages.error.content.type.not.allowed=不支持上传该类型的文件
struts.messages.error.file.too.large=上传文件过大,请重试
struts.messages.error.uploading=上传文件时发生错误
---------
国际化
---------
<constant name="struts.custom.i18n.resources" value="messages"/>
messages_en_US.properties
messages_zh_CN.properties
==============================
下载
==============================
处理下载的类:org.apache.struts2.dispatcher.StreamResult
== 属性 ==
String contentType = "text/plain";
String contentLength;
String contentDisposition = "inline";
String inputName = "inputStream";
InputStream inputStream;
int bufferSize = 1024;
== 说明 ==
contentType
内容类型,和互联网MIME标准中的规定类型一致,例如text/plain代表纯文本,text/xml表示XML,image/gif代表GIF图片,image/jpeg代表JPG图片
用来做动态文件下载的,事先并不知道未来的文件类型是什么,那么我们可以把它的值设置成为:application/octet-stream;charset=ISO8859-1 ,注意一定要加入charset,否则某些时候会导致下载的文件出错
inputName
下载文件的来源流,对应着action类中某个类型为Inputstream的属性名,例如取值为inputStream的属性需要编写getInputStream()方法
contentDisposition
文件下载的处理方式,包括内联(inline)和附件(attachment)两种方式,而附件方式会弹出文件保存对话框,否则浏览器会尝试直接显示文件。取值为:attachment;filename="struts2.txt",表示文件下载的时候保存的名字应为struts2.txt。如果直接写filename="struts2.txt",那么默认情况是代表inline,浏览器会尝试自动打开它,等价于这样的写法:inline; filename="struts2.txt"
bufferSize
下载缓冲区的大小
# contentType属性和contentDisposition分别对应着HTTP响应中的头Content-Type和Content-disposition头。
如:
HTTP头内容:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-disposition: attachment;filename="struts2.txt"
Content-Type: text/plain
Transfer-Encoding: chunked
Date: Sun, 02 Mar 2008 02:58:25 GMT
----------
action
----------
Class DownloadAction extends ActionSupport {
private String path;
// setter... getter...
//必须返回一个输入流,该流是让用户下载的
public InputStream getDownloadFile() {
//从某个文件获得流 --这里是获得项目root下upload下的文件
//也可以 new FileInputStream("c:/test.text");
return ServletActionContext.getServletContext().getResourceAsStream("/upload/struts2.ppt");
}
public String execute() throws Exception {
return SUCCESS;
}
}
-----------
struts.xml
-----------
<action name="download" class="org.scorpio.jh.struts2.upload.action.DownloadAction">
<!-- 依赖注入文件路径 -->
<param name="path">/download/xhtml.txt</param>
<!-- 设置结果类型为 流 -->
<result name="success" type="stream">
<!-- 设置内容类型 -->
<param name="contentType">text/plain</param>
<!-- 设置下载文件的名字 attachment:作为附件,filename=:指定下载文件名-->
<param name="contentDisposition">attachment;filename="xhtml.txt"</param>
<!-- 设置下载文件的输入流对应的方法 downloadFile对应DownloadAction中的getDownloadFile()-->
<param name="inputName">downloadFile</param>
<!-- 指定下载文件的缓冲大小 -->
<param name="bufferSize">4096</param>
</result>
</action>
==========================
解决下载文件名中文问题
==========================
1.在下载action获取文件名的方法中先进行转码然后再返回
path = new String( path.getBytes(), "ISO-8859-1" );
2.xml配置文件动态的获取path的值
<param name="contentDisposition">attachment;filename="${path}"</param>
${path} 用于动态的获取所配置的action中path成员的值,相当于调用getPath()方法
-------
action
-------
private String path;
public String getPath() {
try { //转换成西欧字符集
path = new String( path.getBytes(), "ISO-8859-1" );
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return path;
}
public void setPath(String path) {
this.path = path;
}
---------------
struts.xml
---------------
<action name="download" class="org.scorpio.jh.struts2.upload.action.DownloadAction">
<param name="path">/download/wmlscript实例.txt</param>
<result name="success" type="stream">
<param name="contentType">text/plain</param>
<!-- 动态的获取 DownloadAction的path属性 -->
<param name="contentDisposition">attachment;filename="${path}"</param>
<param name="inputName">downloadFile</param>
<param name="bufferSize">4096</param>
</result>
</action>
=================
安全隐患
=================
访问者如果精通Struts 2的话,它可能使用这样的带有表单参数的地址来访问:
http://localhost:8080/struts2hello/download3.action?inputPath=/WEB-INF/web.xml,这样的结果就是下载后的文件内容是您系统里面的web.xml的文件的源代码,甚至还可以用这种方式来下载任何其它JSP文件的源码。这对系统安全是个很大的威胁。作为一种变通的方法,读者最好是从数据库中进行路径配置,然后把Action类中的设置inputPath的方法统统去掉,简言之就是删除这个方法定义:
public void setPath(String path) {
this.path = path;
}
而实际情况则应该成为 download.action?fileid=1 类似于这样的形式来进行。或者呢,读者可以在execute()方法中进行路径检查,如果发现有访问不属于download下面文件的代码,就一律拒绝,不给他们返回文件内容。例如,我们可以把刚才类中的execute()方法加以改进,成为这样:
public String execute() throws Exception {
// 文件下载目录路径
String downloadDir = ServletActionContext.getServletContext().getRealPath("/download");
// 文件下载路径
String downloadFile = ServletActionContext.getServletContext().getRealPath(inputPath);
java.io.File file = new java.io.File(downloadFile);
downloadFile = file.getCanonicalPath();// 真实文件路径,去掉里面的..等信息
// 发现企图下载不在 /download 下的文件, 就显示空内容
if(!downloadFile.startsWith(downloadDir)) {
return null;
}
return SUCCESS;
}
这时候如果访问者再企图下载web.xml的内容,它只能得到一个空白页,现在访问者只能下载位于/download目录下的文件
其他的一些资料:
Struts 2中实现文件上传
http://www.blogjava.net/max/archive/2007/03/21/105124.html
Struts 2中实现文件下载(修正中文问题)
http://www.blogjava.net/beansoft/archive/2008/03/03/183468.html
Struts 1文件下载:
http://hi.baidu.com/gisland/blog/item/268caecc7b4eea1301e9288f.html
http://hi.baidu.com/joe_tech/blog/item/164ced16bd0cbe52f2de3235.html
发表评论
-
Struts2中获取HttpServletRequest,HttpSession
2009-03-13 13:42 3559在没有使用Struts2之前,都习惯使用HttpServlet ... -
struts拦截器的使用
2008-11-07 10:13 1248http://www.java3z.com/cwbwebhom ... -
struts2与Servlet耦合
2008-11-07 10:07 1508============================= ... -
struts2中的struts.properties
2008-11-07 10:05 934struts.action.extension ... -
ActionContext和ServletActionContext区别
2008-11-07 10:03 5254ActionContextxwork框架的ActionCon ... -
struts2中的OGNL
2008-11-07 10:01 1028本人是一个EL(Expression Language,以下译 ... -
struts2简介
2008-11-07 09:43 1027• Struts 2 Action类可以实 ... -
用类代替资源文件
2008-11-01 15:13 9901 Hello.java package local;imp ... -
java国际化
2008-11-01 14:40 1115package local;import java.util. ... -
struts 主要配置文件摘要
2008-10-31 18:08 1158struts.properties 放在src下 ... -
struts2拦截器(简单)
2008-10-28 15:19 8891.LoginAction.java package le ... -
动态代理proxy
2008-10-28 14:36 8831.Dog.java package com.proxy ... -
struts2 下载
2008-10-28 11:21 943本实例下载.详见附件 -
Struts2实现文件上传多个实例...
2008-10-28 10:33 18701.UploadAction.java package ... -
struts2代码实现过滤
2008-10-28 09:33 17341.UploadAction.java package l ... -
struts2自动实现过滤
2008-10-27 17:35 1155只需在struts.xml 改写为: <?xml v ... -
Struts2实现文件上传实例...
2008-10-27 17:19 56271.UploadAction.java package l ...
相关推荐
1. 文件上传原理: ASP文件上传主要是通过HTML表单中的`<input type="file">`元素来实现的。用户选择文件后,表单提交到服务器,服务器端的ASP代码解析请求并处理文件。由于HTTP协议本身的限制,文件上传不支持进度...
1. 文件上传原理: 文件上传是通过HTTP或HTTPS协议实现的。用户选择本地文件后,浏览器将文件内容转化为二进制数据,并封装成HTTP请求发送到服务器。服务器接收到请求后,将数据保存到指定位置,通常是一个存储系统...
纯java代码,演示上传文件,适合任何文件,主要是了解HTTP请求的信息,然后解析请求的字符串,此事例只考虑了现在的两种主要的浏览器的请求,因为浏览器不一样文件名会有差异,IE就只有文件名,而FF就是全路径名
下面我们将深入探讨文件上传的原理。 1. **前端上传机制** - **HTML表单**:传统的文件上传主要通过`<form>`标签实现,设置`enctype="multipart/form-data"`以支持文件上传。`<input type="file">`用于让用户选择...
以下是对Struts2.0文件上传原理的详细解释: 1. **HTTP协议与表单提交** 在HTML表单中,如果需要上传文件,`<form>`标签必须包含`enctype="multipart/form-data"`属性。这是因为普通POST请求无法处理二进制数据,...
1. 文件上传原理: 文件上传通常涉及到HTTP协议中的POST请求。用户通过表单选择本地文件,提交后浏览器会将文件内容封装到HTTP请求中,发送给服务器。服务器接收到请求后,解析请求体,获取文件内容,并将其保存到...
1. 文件上传原理:文件上传通常涉及到HTTP协议中的POST请求,用户通过选择本地文件,然后由浏览器将文件内容以二进制形式发送到服务器。现代Web应用中,还经常使用FormData对象来封装文件和表单数据。 2. ...
- **多文件上传**:upload类库支持一次上传多个文件,用户可以通过表单选择多个文件进行批量上传。 - **格式检查**:上传前可对文件类型进行检查,只允许特定类型的文件通过,例如只接受图片或某些特定文档格式。 ...
### Web文件上传原理详解 #### 一、引言 随着互联网技术的发展,用户与网站之间的交互变得越来越频繁和复杂,其中文件上传就是一种常见的交互方式。无论是上传照片、文档还是视频,都离不开文件上传功能的支持。...
1. 文件上传原理:HTTP协议本身不支持大文件上传,但可以通过POST请求携带文件数据。SmartUpload包正是基于此原理,通过 multipart/form-data 编码方式处理文件数据,将文件内容分割成多个部分进行传输。 2. ...
1. 文件上传原理: 在HTTP协议中,文件上传通常通过POST请求实现,尤其是multipart/form-data编码类型。这种编码方式可以将表单数据分割成多个部分,每部分都包含了内容类型和内容,这样就可以上传多个文件或混合...
### 文件上传原理详解 在互联网应用中,文件上传是一个常见且重要的功能,它允许用户将本地文件发送到服务器,以供后续处理或存储。这一过程不仅涉及到前端与后端的交互,还涉及到网络通信、数据格式转换、安全性...
### 文件上传原理详解 #### 一、引言 随着信息技术的快速发展,Web应用程序已经成为现代办公自动化系统中的核心组成部分。在这些应用中,文件上传是一项基本而又重要的功能,它允许用户从本地计算机向服务器发送...
5. 文件上传原理: Uploadify通过JavaScript监听文件选择事件,当用户选择文件后,会调用Flash对象进行实际的文件上传操作。上传过程中,Uploadify会发送一系列HTTP POST请求到服务器,携带文件数据。服务器端的...
原理: FileUpload实现上传功能, UploadListener 监听上传进度, DWR push (Reverse Ajax) 进度信息并更新页面, 实现无刷新多文件上传 运行环境: Tomcat 5/6 测试通过 说明:累计上传文件不超过10M(可以更改...
1. Struts2文件上传原理:Struts2通过`org.apache.struts2.components.File`组件来处理文件上传。当用户在表单中提交带有`enctype="multipart/form-data"`属性的表单时,浏览器会将文件作为多部分请求发送到服务器。...
1. 文件上传原理: 文件上传的核心在于HTTP协议中的POST请求。在HTML表单中,我们通常使用`<input type="file">`来创建一个文件选择器,用户可以选择要上传的文件。当用户提交表单时,浏览器会将选中的文件内容作为...
2. 文件上传原理: 在Silverlight中,文件上传主要依赖于`System.Windows.Browser.HtmlPage`类,它可以与HTML DOM交互,调用JavaScript函数来实现跨域通信。文件上传通常涉及到HTML的`<input type="file">`元素,...
1. 文件上传原理:文件上传通常基于HTTP或HTTPS协议,利用POST请求将文件数据发送到服务器。在HTML5中,`<input type="file">`标签用于让用户选择文件,然后通过AJAX或者表单提交将文件数据发送到服务器。 2. ...
计算机病毒与防护:文件上传漏洞原理 文件上传漏洞是网络安全领域中的一个重要问题,尤其是在Web应用程序中,这种漏洞可能导致严重的安全威胁。许多网站提供文件上传功能,例如用户上传头像、社交网络上的照片分享...