文件上传的原理
 
1、文件上传表单
  首先需要编写一个能提供文件上传功能的表单,程序如下所示:
<Form action="upload.jsp" method=post enctype="multipart/form-data">
上传文件:
<Input type=file name=file1><br>
<input type=submit name=upload value="上传">
</form>
  其中,enctype参数用来设置表单的MIME编码方式,在进行文件(或同时包含文本框)上传时,必须将其属性设置为"multipart/form-data"
2、上传文件格式分析
  分析浏览器上显示的上传文件的二进制代码,发现代码包括四个部分(若同时上传多个文
件或文本框,则代码按上传的先后次序排列,格式相同),每一部分的内容是用回车换行符号来进行分隔的:
  1)第一部分(起始标志)
  -----------------------------7d329631b04d4
  2)第二部分(文件说明)
Content-Disposition: form-data; name="file1"; filename="C:\Documents and Settings\Administrator\My Documents\Invitation.doc" Content-Type: application/msword
  在此,我们可以获得上传文件的文件名称及绝对路径,也可以获得文件类型。这些信息是正确保存文件所不可缺少的。
  3)第三部分(文件内容)
  即文件的二进制内容,略。
  4)第四部分(结束标志)
-----------------------------7d329631b04d4
  结合第一部分和第四部分的内容来看,"-----------------------------7d329631b04d4"(每次上传,数值都不一样)起到了分割符的作用,它标志着一段数据(当有多个上传内容时)的开
始和结束。从保存文件所需要的信息来讲,我们首先需要从第二部分数据的"filename"中获得文件名称,然后需要正确定位文件的起始位置,最后利用ASP技术将二进制文件用本来的文件名保存即可。若同时上传多个内容(如多个文本框和文件),也是按同样的方法处理,每部分的内容都包含在分割符之中,只是文本框和文件的表现形式稍有不同,这可以通过具体分析其二进制代码来了解。
==================================
Struts2上传文件
增加commons-fileupload-1.2.jarcommons-io-1.3.1.jarlib
=====
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
//   
String execute() throws Exception {
InputStream is = new FileInputStream( file );
String root = Request().getRealPath("/upload");
File destFile = new File(FileFileName());
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
l                      ----的设置
org.apache.struts2.default.properties  ----全局属性的设置
33  ding=UTF-8  默认UTF-8
可以在l下进行设置
<struts>
设置字符集
<constant name="ding" value="gbk"/>
inputtypefile不上传文件设置上传文件缓存
<constant name="struts.multipart.saveDir" value="c:\"/>
</struts>
其他属性
struts.multipart.parser=jakarta  struts2采用那种方式上传
                        pell
                        cos
struts.multipart.maxSize=2097152  默认上传文件最大的请求大小2M
sion=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 (i));
  String root = Request().getRealPath("/upload");
  File destFile = new File(FileFileName().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 = ElementById("more");
//生成一个换行符
var br = ateElement("br");
//创建一个input组件
var input = ateElement("input");
var button = ateElement("input");
//指定类型 file 为文件上传
pe = "file";
//指定组件的名字
input.name = "file";
pe = "button";
button.value = "删除";
//为删除按钮注册一个事件
lick = 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:允许的类型
-------------
l
-------------
<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>

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。