第一:概念
1.表单的enctype属性指定的是表单数据的编码格式,该属性有三个值:
---1,application/x-www-from-urlencoded:这是默认的编码方式,他只处理表单域里的value属性,采用这种编码方式的表单会将表单域中的值处理成url编码方式。
注释:以这种方式提交带图片的表单的时候,请求参数是用二进制的形式读到的三个请求参数以及对应的值。实际上web服务器替我们处理了这个二进制流并将二进制流
转换成了对应的请求参数的值。但是即使通过底层的二进制输入流,一样可以读到请求的内容:一个普通的字符串,这个字符串包含了三个请求参数,分别是file、wawa、dd.
这是通过HttpServletRequest和getparameter来获得正确的参数。
---2.multipart/from-data:这种编码方式会以二进制流的形式来处理表单数据,这种编码方式会把文件域指定文件的内容页封装到请求参数里。
注释:一旦设置了enctype=multipart/from-data就无法通过HttpServletRequest对象的getparameter方法获取请求参数
---3.text/plain:这种编码方式当表单的action属性为mailto:URL的形式时比较方便,这种方式主要适用于直接通过表单发送邮件的方式。
2,多文件上传:
---1.action层的属性都变成了数组
----2.在struts.xml中配置允许上传的最大长度。
<constant name="struts.multipart.maxSize" value="10701096"/>
<constant name="struts.custom.i18n.resources" value="lang"/>
第二:多文件上传
1.jsp页面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<form action="uploadAction.action" method="post" enctype="multipart/form-data">
img:<input type="file" name="img" value=""><br/>
img:<input type="file" name="img" value=""><br/>
img:<input type="file" name="img" value=""><br/>
img:<input type="file" name="img" value=""><br/>
<input type="submit" name="sub" value=" 上 传 "><br/>
</form>
</body>
</html>
2.struts.xml配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="upload" namespace="" extends="struts-default">
<action name="uploadAction" class="action.UploadAction">
<result name="success">/success.jsp</result>
</action>
</package>
</struts>
3.action层
package action;
import java.io.File;
import java.util.Locale;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class UploadAction extends ActionSupport {
private File img[];
private String imgFileName[];
private String imgContentType[];
public File[] getImg() {
return img;
}
public void setImg(File[] img) {
this.img = img;
}
public String[] getImgFileName() {
return imgFileName;
}
public void setImgFileName(String[] imgFileName) {
this.imgFileName = imgFileName;
}
public String[] getImgContentType() {
return imgContentType;
}
public void setImgContentType(String[] imgContentType) {
this.imgContentType = imgContentType;
}
public String execute()
{
String path = ServletActionContext.getServletContext().getRealPath("img");
try
{
System.out.println(img);
for(int x=0;x<img.length;x++)
{
String fname=imgFileName[x];
//在服务器上创建相应的文件对象
File f = new File(path+"/"+fname);
//获得上传的内存中的文件对象
File oldFile = img[x];
//将上传的文件拷贝到服务器的文件中
FileUtils.copyFile(oldFile, f);
}
}
catch(Exception ex)
{
ex.printStackTrace();
}
return "success";
}
}
第三:文件上传与国际化
1.jsp页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<span style="color: red"><s:fielderror/></span>
<form action="upload.action" method="post" enctype="multipart/form-data"><%--
<!-- 显示资源文件的value的一种方法 -->
<s:i18n name="UploadAction">
<s:text name="t"></s:text>
</s:i18n><br>
<!--显示资源文件的值的第二种方法-->
<s:text name="t"></s:text> <br>
--%>
<s:text name="t"/>:<input type="text" name="titel"><br/>
<s:text name="i"/>:<input type="file" name="upload"><br/>
<input type="submit" value="上传">
</form>
<s:debug></s:debug>
</body>
</html>
2.struts.xml配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<!-- 指定国际化资源文件baseName为globalMessages -->
<constant name="struts.custom.i18n.resources" value="globalMessages"></constant>
<!-- 给全局国际化资源文件配置的 -->
<constant name="struts.custom.i18n.resources" value="lang"></constant>
<!-- 设置该应用试验的解码集 -->
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
<package name="lee" namespace="/" extends="struts-default">
<action name="upload" class="action.UploadAction">
<interceptor-ref name="fileUpload" ><!-- 这是jar包中的类名 ,struts2的拦截器类-->
<param name="allowedTypes">image/bmp,image/png,image/gif,image/jpeg,image/jpg </param><!-- 设置允许上传的文件的类型 -->
<param name="maximumSize">200</param> <!-- 设置允许上传文件的文件大小 -->
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
<!-- 动态设置action的属性,设置图片保存路径。也就是保存在tomcat中项目的根目录下的upload文件夹中 -->
<param name="savePath">/upload</param>
<result name="input">/index.jsp</result><!-- 上传失败重新上传 -->
<result>/success.jsp</result>
</action>
</package>
</struts>
3.action层:
package action;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class UploadAction extends ActionSupport{
private String title;//封装文件标题请求参数
private File upload;//封装文件上传域,也就是文件上传到哪了。*
private String uploadContentType;//获得上传文件类型。*
private String uploadFileName;//获得上传文件名*
private String savePath;//直接在struts.xml中配置的属性。依赖注入
/* //由于需要过滤,因此加属性
private String allowTypes;//允许上传的类型
public String getAllowTypes() {
return allowTypes;
}
public void setAllowTypes(String allowTypes) {
this.allowTypes = allowTypes;
}*/
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public File getUpload() {
return upload;
}
public void setUpload(File upload) {
this.upload = upload;
}
public String getUploadContentType() {
return uploadContentType;
}
public void setUploadContentType(String uploadContentType) {
this.uploadContentType = uploadContentType;
}
public String getUploadFileName() {
return uploadFileName;
}
public void setUploadFileName(String uploadFileName) {
this.uploadFileName = uploadFileName;
}
public String getSavePath() {
//return savePath;
System.out.println("输出保存位置:"+ServletActionContext.getServletContext().getRealPath(savePath));
return ServletActionContext.getServletContext().getRealPath(savePath);
}
public void setSavePath(String savePath) {
this.savePath = savePath;
}
/*
//过滤上传的文件,types是允许上传的文件类型
public String filterType(String[] types){
System.out.println("该文件的类型:"+uploadContentType);
//获取当前正在上传的文件类型
String filetype=this.getUploadContentType();
for(String type:types){
if(type.equals(filetype)){
return null;
}
}
return INPUT;
}*/
@Override
public String execute() throws Exception {
System.out.println("---------"+uploadContentType);
/*System.out.println("========="+this.getAllowTypes());
System.out.println(getAllowTypes().split(","));
//将允许上传的文件类型的字符串以逗号分开,放入字符串中,从而判断当前文件类型是否允许上传。filterRequest是接收filterType方法的返回值
String filterRequest=this.filterType(this.getAllowTypes().split(","));
System.out.println("看一看:"+filterRequest);
if(filterRequest!=null){
ActionContext.getContext().put("typeError", "你要上传的文件类型不正确");
return filterRequest;
}
*/
//以服务器的文件保存地址和原文件名建立上传文件的输出流
FileOutputStream fos=new FileOutputStream(getSavePath()+"/"+getUploadFileName());//调用了两个get方法
FileInputStream fis=new FileInputStream(this.getUpload());
byte[] buffer=new byte[1024];
int len=0;
while((len=fis.read(buffer))>0){
fos.write(buffer, 0, len);
}
return SUCCESS;
}
}
相关推荐
在Struts2中,文件上传功能是一个常用特性,尤其在处理用户提交的多个文件时。本文将详细讲解如何使用Struts2进行多个文件的上传,重点是使用List集合进行上传。 首先,要实现Struts2的文件上传,必须引入必要的...
下面将详细介绍如何利用SWFUpload与Struts2来实现多文件上传。 **一、SWFUpload组件介绍** SWFUpload 是一个JavaScript库,它利用Flash技术提供了一个高级的文件上传体验。它的主要特性包括: 1. **多文件选择**...
通过以上步骤,你可以实现一个基于Struts2和Hibernate的文件上传与动态下载系统。这个系统能够处理用户上传的文件,将其保存到服务器,同时提供动态下载功能,允许用户根据需要下载文件。在实际开发中,还需要考虑...
本实例主要探讨如何在Struts1中实现多文件上传功能,并结合Form中传递List类型的数据,这对于理解MVC模式下的文件处理和数据传递有重要作用。我们将深入讨论以下几个关键知识点: 1. **Struts1框架基础**: Struts...
文件上传比较多,多文件上传少一点 文件下载很少的,看似简单,实则不然 网上的Struts2进行的文件下载一般都是单文件或者固定的文件,并没有(很少)实现随意文件的下载的例子 提供多文件上传,上传成功后,提供...
Struts2提供了完善的文件上传支持,让我们来详细探讨如何在Struts2中实现多文件上传。 首先,我们需要在Struts2的配置文件(struts.xml)中启用文件上传的支持。这通常涉及到添加`<constant>`标签来设置`struts....
Struts2框架是Java Web开发中的一个流行MVC(Model-View-Controller)框架,它提供了丰富的功能,包括处理表单提交、文件上传等。在Struts2中,文件上传是一个常见的需求,可以帮助用户从客户端上传文件到服务器。...
对于大量文件上传,可以考虑使用多线程处理,提高上传效率。还可以添加进度条显示、断点续传等功能,提升用户体验。 以上就是使用Struts2框架实现文件上传下载的基本步骤和关键知识点。在实际开发中,可以根据项目...
综上所述,Struts1中的文件上传功能实现涉及到多个核心组件和技术点的综合运用。开发者需要对Struts1框架有深入的理解,并熟练掌握相关API的使用方法。此外,在实际开发过程中还需要注意安全性问题,比如防止恶意...
在Struts2中,文件上传和下载是常见的功能需求,特别是在处理用户交互和数据交换时。这篇博客文章提供的"struts2文件上传下载源代码"旨在帮助开发者理解和实现这些功能。 文件上传功能允许用户从他们的设备上传文件...
这可以通过添加`<constant>`标签来设置`struts.multipart.parser`为jakarta,这是Struts2推荐的多部分解析器,以支持大文件上传。同时,设置`struts.multipart.maxSize`属性,限制上传文件的大小。 ```xml ...
在Struts中,可以实现单文件和多文件的上传,并且为了提升用户体验,我们还可以添加进度条来显示文件上传的状态。本文将详细介绍如何在Struts中实现这两个功能,并带上传进度条。 首先,我们需要了解Struts中处理...
JavaEE Struts 文件上传是Web开发中的一个常见需求,它允许用户从客户端向服务器传输文件。Struts作为JavaEE框架的一部分,提供了强大的功能来处理这种交互。以下是对这个主题的详细解析。 首先,理解文件上传的...
在处理文件上传时,Struts2提供了便捷的API和配置方式,使得开发人员能够轻松实现多文件上传的功能。下面将详细阐述如何使用Struts2来实现多个文件的上传。 首先,理解文件上传的基本原理。在HTTP协议中,文件上传...
本篇文章将深入讲解如何在Struts框架中实现多文件上传。 首先,了解Struts2文件上传的基本原理。Struts2使用了Apache的Commons FileUpload库来处理文件上传。在Struts2的Action类中,我们通常会有一个或多个`File`...
1. **文件上传组件**:在Struts2中,我们通常使用`Commons FileUpload`库来处理文件上传。这个库提供了处理多部分HTTP请求的能力,是Java中处理文件上传的标准库。我们需要在Struts2配置文件中引入对应的拦截器`...
在这个“Struts1实现的文件上传”项目中,我们将深入探讨如何在Struts1框架下实现文件上传功能,并不涉及文件下载的部分。 首先,理解文件上传的基本流程是至关重要的。在Web应用中,用户通过HTML表单选择本地文件...
在文件上传场景中,Struts2主要负责接收前端发送的文件数据,并将这些数据存储到服务器的指定位置。配置Struts2的Action类和相应的XML配置文件,可以定义文件上传的处理逻辑。 接着,jQuery是一个高效、简洁的...