java中struts2实现文件上传下载功能

作者:GYW 时间:2021-11-16 19:53:47 

先谈一谈struts2实现文件的上传和下载实例实现的原理

Struts 2是通过Commons FileUpload文件上传。

Commons FileUpload通过将HTTP的数据保存到临时文件夹,然后Struts使用fileUpload * 将文件绑定到Action的实例中。从而我们就能够以本地文件方式的操作浏览器上传的文件。

具体实现

一、创建index.jsp页面


<body>
<s:form action="upload" method="post" theme="simple" enctype="multipart/form-data">
<table align="center" width="50%" border="1">
<tr>
 <td>选择上传文件</td>
 <td id="more">
  <s:file name="file"></s:file>
  <input type="button" value="Add More.." onclick="addMore()">
 </td>
</tr>
<tr>
 <td><s:submit type="button" value="submit" onclick="return checkf()"/></td>
 <td><s:reset value="reset "></s:reset></td>
</tr>
</table>
<table align="center" width="50%" border="1">
<tr>
<td>测试.txt</td>
<td>
 <a href="<s:url value='download.action'><s:param name='fileName'>测试.txt</s:param> </s:url>">下载</a>
</td>
</tr>
</table>
</s:form>
</body>

创建result.jsp页面


<body>
<s:form>
<div style="border:1px solid black">成功上传的文件:<br>
 <ul style="list-style-type:decimal">
<s:iterator value="#request.fileName" id="file" status="status">
  <li><s:property/> </li>
</s:iterator>
 </ul>
</div>
</s:form>
</body>

当然别忘了在每个页面上都添加上struts2 标签引用<%@taglib prefix="s" uri="/struts-tags" %>

二、创建updown.js文件,在index.jsp中引用


function checkf(){
var files = document.getElementsByName("file");
if(files[0].value.length!=0){
  return true;
 }else{
 alert("请选择文件");
 return false;
 }
}
function addMore()
{
var td = document.getElementById("more");
var br = document.createElement("br");
var input = document.createElement("input");
var button = document.createElement("input");
input.type = "file";
input.name = "file";
button.type = "button";
button.value = "Remove";
 button.onclick = function()
{
 td.removeChild(br);
 td.removeChild(input);
 td.removeChild(button);
}
 td.appendChild(br);
td.appendChild(input);
td.appendChild(button);
}

三、创建upDownloadAction.java


package com.action;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.ServletActionContext;

public class UpDownloadAction extends ActionSupport {

private static final long serialVersionUID = 1L;
private List<File> file;// 对应jsp中file标签
private List<String> fileFileName;//
private List<String> fileContentType;//
private String fileName;//获得jsp中pram参数
@SuppressWarnings("deprecation")
// 文件上传
public String uploadFiile() throws Exception {
 String root = ServletActionContext.getServletContext().getRealPath(
   "/upload");// 上传路径
 System.out.println(root);
 InputStream inputStream;
 File destFile;
 OutputStream os;
 for (int i = 0; i < file.size(); i++) {
  inputStream = new FileInputStream(file.get(i));
  destFile = new File(root, this.getFileFileName().get(i));
  os = new FileOutputStream(destFile);
  byte[] buffer = new byte[400];
  int length = 0;
  while ((length = inputStream.read(buffer)) > 0) {
   os.write(buffer, 0, length);
  }
  inputStream.close();
  os.close();
 }
 HttpServletRequest request = ServletActionContext.getRequest();
 request.setAttribute("fileName", fileFileName);
 return SUCCESS;
}

// 文件下载
public InputStream getDownloadFile() throws FileNotFoundException,
  UnsupportedEncodingException {
 System.out.println(getFileName());

// 如果下载文件名为中文,进行字符编码转换
 ServletActionContext.getResponse().setHeader("Content-Disposition","attachment;fileName="
     + java.net.URLEncoder.encode(fileName, "UTF-8"));
 InputStream inputStream = new FileInputStream("F:/" //使用绝对路径 ,从该路径下载“测试.txt"文件
   + this.getFileName());
 System.out.println(inputStream);
 return inputStream;
}

// 下载
public String downloadFile() throws Exception {
 return SUCCESS;
}

public String getFileName() throws UnsupportedEncodingException {
 return fileName;
}

public void setFileName(String fileName)
  throws UnsupportedEncodingException {
 this.fileName = new String(fileName.getBytes("ISO8859-1"), "utf-8");
}
}

注:属性的 get和set方法已省略。

四、最后是配置文件

1、web.xml配置


<filter>
 <filter-name>struts2</filter-name>
 <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>

<filter-mapping>
 <filter-name>struts2</filter-name>
 <url-pattern>/*</url-pattern>
</filter-mapping>

2、struts.xml配置


<struts>
<constant name="struts.i18n.encoding" value="utf-8"></constant>
<constant name="struts.multipart.saveDir" value="f:\"></constant>
<package name="struts2" extends="struts-default">
 <action name="upload" class="com.action.UpDownloadAction" method="uploadFiile">
  <result name="success">/jsp/result.jsp</result>
  <interceptor-ref name="fileUpload">
<!--maximumSize (可选) - 这个 * 允许的上传到action中的文件最大长度(以byte为单位).
注意这个参数和在webwork.properties中定义的属性没有关系,默认2MB-->
   <param name="maximumSize">409600</param>
<!--allowedTypes (可选) - 以逗号分割的contentType类型列表(例如text/html),
这些列表是这个 * 允许的可以传到action中的contentType.如果没有指定就是允许任何上传类型.-->
   <param name="allowedTypes">
    text/plain
   </param>
  </interceptor-ref>
  <interceptor-ref name="defaultStack"></interceptor-ref>
 </action>
 <action name="download" class="com.action.UpDownloadAction" method="downloadFile" >
  <result name="success" type="stream">
  <!--指定文件下载类型  application/octet-stream默认值可以下载所有类型 -->
   <param name="contentType">
    application/txt;
   </param>
  <!-- 指定下载的文件名和显示方式 ,但注意中文名的乱码问题,解决办法是:进行编码处理-->
  <!--contentDisposition是文件下载的处理方式,包括内联(inline)和附件(attachment),
  默认是inline, 使用附件时这样配置:attachment;filename="文件名" 。-->
   <param name="contentDisposition">
    attachment;filename="${fileName}"
   </param>
  <!--由getDownloadFile()方法获得inputStream-->
   <param name="inputName">downloadFile</param>
<!--    指定下载文件的缓存大小-->
   <param name="bufferSize">2048</param>
  </result>
 </action>
</package>
</struts>

一个简单的Struts2多文件上传单文件下载就实现了。

标签:Struts2,上传,下载
0
投稿

猜你喜欢

  • Android传递Bitmap对象在两个Activity之间

    2023-09-01 22:30:17
  • Kotlin高阶函数reduce与fold使用实例

    2023-04-27 22:17:11
  • Android 中的两端对齐实例详解

    2022-05-13 06:58:18
  • java实习--每天打卡十道面试题!

    2021-12-06 15:22:19
  • Kotlin入门教程之开发环境搭建

    2022-04-22 20:58:12
  • Flutter验证码输入框的2种方法实现

    2023-07-17 16:22:07
  • SpringBoot启动后启动内嵌浏览器的方法

    2023-02-27 17:42:53
  • Android studio so库找不到问题解决办法

    2023-10-28 02:20:49
  • 详解C#中的out和ref

    2023-08-13 18:15:21
  • Java Fluent Mybatis 项目工程化与常规操作详解流程篇 上

    2022-08-28 16:47:28
  • Java中StringTokenizer的用法简介汇总

    2023-05-29 00:52:24
  • java使用JNA(Java Native Access)调用dll的方法

    2022-02-06 09:27:34
  • Android自定义View实现九宫格图形解锁(Kotlin版)

    2022-04-09 11:10:50
  • Activiti常用类简介

    2021-07-02 21:58:13
  • Android实现按钮拖拽还原功能

    2023-10-22 18:31:13
  • 详解Java中LinkedHashMap

    2022-05-23 16:24:45
  • Java 客户端操作 FastDFS 实现文件上传下载替换删除功能

    2022-06-01 15:01:38
  • 点九图片的显示内容区域应作何理解

    2022-12-27 12:24:30
  • java中计算字符串长度的方法及u4E00与u9FBB的认识

    2022-07-15 18:28:20
  • SpringBoot接口加密解密统一处理

    2023-04-12 19:42:04
  • asp之家 软件编程 m.aspxhome.com