`

struts文件上传

阅读更多
struts实现文件上传比较简单,只要使用<html:file>标签就可以了。但是要注意的是要在<html:form>标签内设置enctype属性为"multipart/form-data"。这样提交的html内容会多部分提交,上传文件的数据信息也会被解析了。具体机制就不深究了。

实现真正的文件上传功能当然不是一个标签就可以搞定的。<html:file>标签发送的数据包括有文件名,文件大小,以及文件的数据。为了测试方便,在业务实体中定义的相关文件类的类型是FormFile。这个类似struts提供的。当然实际应用中应该把业务逻辑层和web层分离,不应该使用FormFile类。

FormFile类中可以获取文件的文件名,大小,及数据。
当收到客户端上传的文件时,可以调用FormFile的getInputStream方法获取输入流,再写到相应的磁盘文件中。乍一看很简单,但是上传的时候有很多问题。比如别人利用这个上传功能上传一个包含恶意代码的JS文件,利用浏览器调用,损失就大了。再比如文件名的问题,当用户上传2个相同名字的文件时,第二次上传的文件会覆盖第一次上传时存在磁盘里的文件。所以文件名应该也是不能重复的。

第一个问题可以限制上传的文件类型。同时把文件存在浏览器无法访问的位置。同时还可以写一个配置文件,通过配置文件设置文件具体保存的位置。配置文件只需要产生一次,所以可以用单例模式。具体实现类如下:
public class ConfigManager {
private ConfigManager(){}

private static ConfigManager instance = new ConfigManager();
public static ConfigManager getInstance()
{
  return instance;
}
//configPath为配置文件所在路径
public String getSavePath(String configPath){
 
  String savePath = null;
  try {
   Properties properties  = new Properties();
   FileInputStream fis = new FileInputStream(configPath);
   properties.load(fis);
   savePath = properties.getProperty("savePath");
   File saveFileDir = new File(savePath);
   if(!saveFileDir.exists()){
    saveFileDir.mkdirs(); //当路径所需的文件夹不存在时,建立相应文件夹
   }
  } catch (FileNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return savePath;//返回存储路径
}
}

第二个问题就要保证上传文件的文件名在磁盘上是唯一的。所以可以利用sun公司提供的UUID类来生全球唯一的字符串。
摘录实现的方法:

private File getStoreFile(FormFile photo) {
   //photo是所上传的文件
  String savDir = ConfigManager.getInstance().getSavePath(this.getServlet().getServletContext().getRealPath("/WEB-INF/config.properties"));//config.properties是存有保存路径的配置文件
 
  String newFileName = null;
  UUID uuid = UUID.randomUUID();
  String prefixName = uuid.toString();//新文件名的前缀由UUID生成
  String fileName = photo.getFileName();
  int index = fileName.lastIndexOf('.');
 
  String extName = index == -1 ? "":fileName.substring(index);//后缀为文件的类型,若没有类型则为空字符串
  newFileName = prefixName + extName;
  File file = new File(savDir,newFileName);
  return file;
}

第三个问题,上传文件的大小问题。
谁都知道硬盘的空间是有限的,如果不限制上传文件的大小,再大的硬盘也会爆掉。
这个可以在struts的config文件中配置。添加<controller>节点,设置maxFileSize属性为你想限制的大小即可。
值得注意的是,若上传文件超过限制大小,会发生一系列问题,其间的原因,大致是struts对有文件上传的request进行了包装处理。当上传文件的大小超过限制,则直接return,而传入的formbeen还没有被提取出啦。这就造成了formbeen内的值全是空值。解决的方法最好是把上传文件控件和普通表单分开,上传文件单独装入一个form中,然后再其提交时验证是否为空。若为空值则报错。

分享到:
评论

相关推荐

    struts2文件上传下载源代码

    这篇博客文章提供的"struts2文件上传下载源代码"旨在帮助开发者理解和实现这些功能。 文件上传功能允许用户从他们的设备上传文件到服务器。在Struts2中,这通常通过表单实现,表单包含一个`&lt;input type="file"&gt;`...

    JavaEE Struts文件上传

    学习Struts2文件上传不仅需要掌握上述概念和技术,还需要了解文件安全性、异常处理和服务器配置等相关知识。在实际应用中,确保文件上传的健壮性和安全性是至关重要的,比如防止文件覆盖、大小限制、非法文件类型...

    struts2文件上传jar

    这个压缩包包含了实现Struts2文件上传所需的全部jar包,这些库文件对于理解和实现文件上传功能至关重要。 首先,我们要了解Struts2文件上传的基本流程。当用户通过表单提交包含文件输入字段的请求时,Struts2框架会...

    struts2实现文件上传下载

    首先,我们需要了解Struts2中的文件上传机制。Struts2提供了`FileUploadInterceptor`拦截器来处理文件上传请求。在处理文件上传时,开发者需要在Action类中声明一个`List&lt;FileInfo&gt;`类型的字段,用于接收上传的文件...

    struts2 文件上传

    Struts2 文件上传是Web开发中的一个重要功能,它允许用户通过网页上传文件到服务器。Struts2 是一个基于MVC(Model-View-Controller)设计模式的Java Web框架,提供了丰富的特性和强大的控制层功能,使得文件上传...

    struts2文件上传

    Struts2 文件上传是Web开发中的一个重要功能,它允许用户从他们的本地计算机向服务器传输文件。在Struts2框架中,文件上传是通过特定的拦截器实现的,这些拦截器处理了文件上传请求并提供了安全性和大小限制。下面将...

    简单易懂的struts2文件上传

    1. **Struts2文件上传概述** 在Struts2中,文件上传主要依赖于Apache的Commons FileUpload库。这个库提供了处理HTTP多部分请求(用于上传文件)的能力。首先,你需要在项目中引入对应的依赖,通常是Apache Commons ...

    struts2文件上传例子.rar

    在“struts2文件上传例子.rar”这个项目中,开发者已经使用Struts2.0框架实现了一个简单的文件上传功能。MyEclipse 6.6是一个集成开发环境,支持Java EE项目开发,可以直接导入该项目进行运行和调试。 首先,我们...

    Struts2之struts2文件上传详解案例struts011

    在这个"Struts2之struts2文件上传详解案例struts011"中,我们将深入探讨如何实现这一功能。 首先,我们需要了解Struts2中的Action类,它是处理用户请求的核心组件。为了支持文件上传,我们需要创建一个继承自`org....

    struts2文件上传实例

    1. **.struts2配置**:在Struts2框架中,需要在`struts.xml`配置文件中添加相应的action配置,声明文件上传的处理方法。通常,你需要设置`&lt;result&gt;`类型为`stream`,以便处理上传的文件。 2. **Action类**:创建一...

    Struts2文件上传源码

    本文将详细讲解Struts2文件上传的实现原理以及源码分析。 首先,理解文件上传的基本流程。当用户通过HTML表单选择文件并提交时,这些文件数据会被封装到HTTP请求中。Struts2框架提供了内置的支持来处理这样的请求,...

    struts2文件上传和下载

    在Struts2中,文件上传和下载是常见的功能需求,对于用户交互和数据交换至关重要。以下是对这些知识点的详细阐述: 1. **文件上传**: 在Struts2中,文件上传主要依赖于`Commons FileUpload`库,它是一个Apache提供...

    struts2文件上传下载

    在这个特定的项目中,我们关注的是"struts2文件上传下载"的功能,这涉及到用户通过Web界面上传文件到服务器,以及从服务器下载文件到用户的设备。 文件上传是Web应用中的常见需求,例如用户可能需要提交图片、文档...

    Struts2文件上传程序示例

    Struts2文件上传程序是一个典型的企业级Web应用开发中的功能,它允许用户通过网页将本地文件上传到服务器。Struts2作为一款强大的MVC(Model-View-Controller)框架,提供了丰富的功能支持,包括文件上传。这个示例...

    Struts2多个文件上传

    在Struts2中,文件上传功能是一个常用特性,尤其在处理用户提交的多个文件时。本文将详细讲解如何使用Struts2进行多个文件的上传,重点是使用List集合进行上传。 首先,要实现Struts2的文件上传,必须引入必要的...

    Struts2文件上传

    Struts2文件上传是Web开发中常见的功能,用于允许用户在网页上选择并上传本地文件到服务器。在Java Web环境中,Struts2框架提供了一套完整的解决方案来处理文件上传请求。下面将详细介绍Struts2文件上传的核心概念、...

    Struts2文件上传带进度条页面无刷新

    "Struts2文件上传带进度条页面无刷新"的实现涉及多个技术点,包括Struts2的文件上传插件、AJAX异步通信以及前端进度条展示。 首先,Struts2的文件上传依赖于`struts2-upload-plugin`。这个插件扩展了Struts2的核心...

Global site tag (gtag.js) - Google Analytics