`

struts实现上传下载

阅读更多

在god老大的激励之下,我开始着手做这个上传下载了,由于它只是个作业,所以我能做的就是完成它,完美和时间的权衡下,时间最重要,我花了一个星期使用不熟练的struts来写程序,对于struts的精神理解已经很透彻了,只是struts标签库里的东西,各种form还没有完全熟悉,呵呵,反正god老大的东西不要struts开发,这也为程序留下缺陷埋下伏笔。下面列出我的代码:

上传:

selfile.jsp

<%@ page language="java"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>
<html:html>
<html:form action="/upload.do" enctype="multipart/form-data">
<html:file property="theFile"/>
<html:submit/>
</html:form>
</html:html>

------------------------------------------------------------------------------------

UploadForm.java

package com.vv.struts.form;

import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.*;
import org.apache.struts.upload.*;

/**
* <p>Title:UpLoadForm</p>
* <p>Description: QRRSMMS </p>
* <p>Copyright: Copyright (c) 2004 jiahansoft</p>
* <p>Company: jiahansoft</p>
* @author wanghw
* @version 1.0
*/

public class UploadForm extends ActionForm {

 public static final String ERROR_PROPERTY_MAX_LENGTH_EXCEEDED = "org.apache.struts.webapp.upload.MaxLengthExceeded";

 protected FormFile theFile;
 public FormFile getTheFile() {
  return theFile;
 }
 public void setTheFile(FormFile theFile) {
  this.theFile = theFile;
 }
 public ActionErrors validate(ActionMapping mapping, HttpServletRequest request)
 {
  ActionErrors errors = null;
  //has the maximum length been exceeded?
  Boolean maxLengthExceeded = (Boolean)
  request.getAttribute(MultipartRequestHandler.ATTRIBUTE_MAX_LENGTH_EXCEEDED);
  if ((maxLengthExceeded != null) && (maxLengthExceeded.booleanValue()))
  {
   errors = new ActionErrors();
   errors.add(ERROR_PROPERTY_MAX_LENGTH_EXCEEDED, new ActionError("maxLengthExceeded"));
  }
  return errors;

 }
}

-------------------------------------------------------------------------------------

UploadAction.java

package com.vv.struts.action;

import java.io.*;
import javax.servlet.http.*;
import org.apache.struts.action.*;
import org.apache.struts.upload.FormFile;
import com.vv.struts.form.UploadForm;

/**
* <p>Title:UpLoadAction</p>
* <p>Description: QRRSMMS </p>
* <p>Copyright: Copyright (c) 2004 jiahansoft</p>
* <p>Company: jiahansoft</p>
* @author wanghw
* @version 1.0
*/

public class UploadAction extends Action {
 
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
 if(form==null) System.out.println("null");
 if (form instanceof UploadForm) {//如果form是uploadsForm
  String encoding = request.getCharacterEncoding();
  if ((encoding != null) && (encoding.equalsIgnoreCase("utf-8")))
  {
   response.setContentType("text/html; charset=gb2312");//如果没有指定编码,编码格式为gb2312
  }
  UploadForm theForm = (UploadForm ) form;
  FormFile file = theForm.getTheFile();//取得上传的文件
  try {
   InputStream stream = file.getInputStream();//把文件读入
   String filePath = request.getRealPath("/");//取当前系统路径
   ByteArrayOutputStream baos = new ByteArrayOutputStream();
   OutputStream bos = new FileOutputStream(filePath + "/file/" +
     file.getFileName());//建立一个上传文件的输出流
   //System.out.println(filePath+"/"+file.getFileName());
   int bytesRead = 0;
   byte[] buffer = new byte[8192];
   while ( (bytesRead = stream.read(buffer, 0, 8192)) != -1) {
    bos.write(buffer, 0, bytesRead);//将文件写入服务器
   }
   bos.close();
   stream.close();
  }catch(Exception e){
   System.err.print(e);
  }
  //request.setAttribute("dat",file.getFileName());
  return mapping.findForward("success");
 }
 return null;
}
}
其它的都是几个次要的页面,老实这部分基本上就是我抄的,虽然我也能写,但是他确实比我写的好,特别是对struts的字段的使用,这些都是我不知道的,我做的只是修改成我要的程序,唯一不好的就是它使用request.getRealPath("/"),这个方法很危险,可是一时间我没有找到更好的方法代替它,这些是可以避免的,为什么使用它和后面的下载有关系,呵呵。

下载:

test.jsp


<%@ page language="java"%>

<a href="/other/download.do">here</a>

---------------------------------------------------------------------------

download.jsp


<%@ page language="java" contentType="text/html;charset=UTF-8"%>

<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-tiles" prefix="tiles" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-template" prefix="template" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-nested" prefix="nested" %>

<html xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:w="urn:schemas-microsoft-com:office:word"
xmlns="http://www.w3.org/TR/REC-html40">

<head>
<style>
</style>
</head>
<body>

 <bean:write name="DownWordForm" property="name" />
 <logic:notEmpty name="list" >
  <logic:iterate id="row" name="list">
   <p><html:link page="/loaded.do" paramId="name" paramName="row">
   <bean:write name="row"/>
   </html:link>
   </p>
  </logic:iterate>
  </logic:notEmpty>
</body>

</html>

对于struts的标签一直不是很理解,在做这个的时候受了不少的苦呀,原来iterate里的row可以作为html:link的属性值,我一直都不知道怎么来动态生成需要的链接,看了好多的例子,甚至在action里要输出到jsp的字符串上再加入字符串“<html:link.......>”,然后用<bean:write>来输出,可惜struts似乎使用了回压字符流的,这个方案失败了,看了动态生成复选框的例子后明白了,修改了后就能用了,中间有个小插曲,我把paramName改为list,然后把<bean:write name="list">,结果把list里的所有值作为一个单独的链接重复list.size()次输出,而不是把list的每个值重复输出list.size()次,原理其实很简单,只是感叹struts的作者写这个好像废了不少的心呀。

DownloadAction.java

package com.vv.struts.action;

import org.apache.struts.action.*;
import javax.servlet.http.*;

import java.io.File;
import java.util.*;
/**
 * <p>Title:DownloadWordAction </p>
 * <p>Description: QRRSMMS </p>
 * <p>Copyright: Copyright (c) 2004 jiahansoft</p>
 * <p>Company: jiahansoft</p>
 * @author wanghw
 * @version 1.0
 */

public class DownloadAction extends Action {
 
 File myDir;
 File[] contents;

  public ActionForward execute(ActionMapping mapping,
                               ActionForm form,
                               HttpServletRequest request,
                               HttpServletResponse response)
      throws Exception {
    DynaActionForm testForm = (DynaActionForm)form;
    testForm.set("name","a test word");
   
    ArrayList list = new ArrayList();
    String path=request.getRealPath("/")+"file";
    String FullPath;
   System.out.println(path);
 myDir=new File(path);
 list.clear();
 contents=myDir.listFiles();
 //HashMap row = new HashMap();
 //System.out.println(contents.length);
 for(int i=0;i<contents.length;i++){
  FullPath=contents[i].getName();
  //row.put("1",FullPath);
  list.add(FullPath);
  System.out.println(FullPath);
 }
    request.setAttribute("list",list);
   
    return mapping.findForward("display");
}
}

又用了限制级的方法,我也不想的我已用相对路径它就报错,我必须承认,这个写的不够标准,应该用资源文件存储文件路径,而不是反复列举,为什么我不用呢?我当时忘了可以用资源文件了。。。。。。。

LoadedForm.java

package com.vv.struts.form;

import org.apache.struts.action.ActionForm;

/**
 * MyEclipse Struts
 * Creation date: 05-18-2006
 *
 * XDoclet definition:
 * @struts:form name="loadedForm"
 */
public class LoadedForm extends ActionForm {

 // --------------------------------------------------------- Instance Variables

 /** name property */
 private String name;

 /**
  * Returns the name.
  * @return String
  */
 public String getName() {
  return name;
 }

 /**
  * Set the name.
  * @param name The name to set
  */
 public void setName(String name) {
  this.name = name;
 }

}

---------------------------------------------------------------------------------

LoadedAction.java

package com.vv.struts.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import java.io.*;
import com.vv.struts.form.LoadedForm;
/**
 * MyEclipse Struts
 * Creation date: 05-17-2006
 *
 * XDoclet definition:
 * @struts:action validate="true"
 */
public class LoadedAction extends Action {

 // --------------------------------------------------------- Instance Variables

 // --------------------------------------------------------- Methods

 /**
  * Method execute
  * @param mapping
  * @param form
  * @param request
  * @param response
  * @return ActionForward
  */
 public ActionForward execute(
  ActionMapping mapping,
  ActionForm form,
  HttpServletRequest request,
  HttpServletResponse response) throws Exception{
 
  LoadedForm doc=(LoadedForm)form;
  //if(form==null) System.out.println("null");
  String docName = doc.getName();
  File f;
  if(docName!=""){
  String docFullPath=request.getRealPath("/");
  //System.out.println(docFullPath);
 
  String Name = docName.substring(0,docName.lastIndexOf("."));
        String prefix = docName.substring(docName.lastIndexOf("."));
        //byte[] dn=Name.getBytes("UTF-8");
        //Name =new String(dn,"ISO-8859-1");
      //Name=java.net.URLEncoder.encode(Name,"GBK");
        docName = Name +prefix;
     
      System.out.println();
      System.out.println(docName);
    
      f = new File(docFullPath+"file\\"+docName);
     if (!f.exists())
     {
            return (mapping.findForward("nofile"));
     }
    
     BufferedInputStream br = new BufferedInputStream(new FileInputStream(f));
     byte[] buf = new byte[1024];
     int len = 0;
     response.reset();       
    
    
     response.setContentType("application/x-msdownload;charset=UTF-8");
     response.setHeader("Content-Disposition", "attachment; filename=" +docName);


      OutputStream out = response.getOutputStream();
      while((len = br.read(buf)) >0)
      out.write(buf,0,len);
      br.close();
      out.close();
      return mapping.findForward("download");
 }
  return mapping.findForward("nofile");
 }
 }

我还是不幸运的遇见中文乱码问题,如果下载的是中文文件的话,那么name的值就是乱码,虽然我用了转换字符的代码,可惜事实上它没有用,在:http://www.mx68.com/WebDeveloper/Print.asp?ArticleID=41762&Page=1中的三个方法我都使用了,可是都没什么太大的变化,只是显示不同的乱码而已,郁闷。实在不行了,只能把这篇不怎么样的作业上交god了。作为个程序员来说,它应该是追求完美的,但是我认为效率和时间是个凸函数,并不是但方面的极致就是最好,两者的最佳切合点才是最好。 

分享到:
评论
1 楼 fighter1945 2009-01-08  
OutputStream out = response.getOutputStream();
      while((len = br.read(buf)) >0)
      out.write(buf,0,len);
      br.close();
      out.close();
return mapping.findForward("download");

你得return mapping.findForward("download");,能够跳转到download页面么
respones都已经提交过了,tomcat里没报错?

相关推荐

    struts实现的文件上传下载功能

    总结起来,使用Struts实现文件上传下载涉及前端表单设计、后端处理逻辑、文件存储策略以及安全控制等多个方面。在实践中,我们还需要考虑到性能优化和用户体验提升,例如使用异步上传、进度条展示等技术。

    使用struts实现上传下载

    综上所述,使用Struts实现文件上传和下载需要对HTTP协议、Servlet、Struts框架以及文件I/O操作有深入理解。通过合理配置和编写代码,可以轻松地在Web应用中集成这些功能。如果你遇到了具体的编程问题,可以查阅提供...

    Struts实现上传下载功能

    在实现上传下载之前,确保你的项目已经集成了Struts2框架,并且配置了相应的struts.xml配置文件。配置文件中需要包含Action的定义,这些Action将处理上传和下载请求。 2. **上传文件**: - **表单设计**:在HTML...

    struts2实现文件上传下载

    Struts2是一个强大的MVC(模型-视图-控制器)框架,广泛应用于Java ...以上就是使用Struts2框架实现文件上传下载的基本步骤和关键知识点。在实际开发中,可以根据项目需求进行调整和优化,确保功能的稳定性和安全性。

    struts2文件上传下载源代码

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

    struts实现文件上传和下载源代码

    在这个"struts实现文件上传和下载源代码"项目中,我们将会探讨如何使用Struts框架来实现在Web应用中进行文件的上传和下载功能,同时还会关注对于大文件(超过3MB)的处理策略。 1. **文件上传** 文件上传是Web应用...

    无中文乱码的Struts上传下载(任意文件上传)

    提供的压缩文件`struts实现上传下载源码及文档`应该包含了完整的实现示例,包括Action类、ActionForm、JSP页面以及使用说明。通过阅读源码和文档,你可以更深入地理解如何在实际项目中应用这些技术。 总之,解决...

    struts实现上传图片

    本文将深入探讨如何使用Struts框架实现图片上传功能,这在许多Web应用中都是一个常见且重要的需求。 ### Struts框架简介 Struts是一个开源的框架,用于创建企业级的Java Web应用。它基于Servlet和JSP技术,并遵循...

    struts与hibernate实现文件的上传与动态下载

    本篇文章将详细讲解如何利用Struts2.2和Hibernate3.6实现文件的上传与动态下载。 **一、文件上传** 1. **环境配置**:首先,你需要一个集成开发环境,例如MyEclipse8.6,并安装所需的Struts2.21、JUnit4.8.2以及...

    struts2上传下载项目

    在"struts2上传下载项目"中,我们可以深入理解如何利用Struts2实现文件的上传与下载功能。 首先,上传功能在Web应用中十分常见,比如用户在注册时上传头像,或者提交文档等。在Struts2中,我们主要借助`struts2-...

    struts 文件上传 Struts实现文件上传

    下面将详细介绍Struts 实现文件上传的相关知识点。 ### 1. Struts 框架概述 Struts 是Apache软件基金会下的一个开源项目,其主要目标是提供一个可扩展且易于维护的架构,用于构建企业级的Java Web应用。它通过分离...

    struts2上传下载实例

    这个"struts2_上传下载"实例则涵盖了多种实现这些功能的方法。 首先,Struts2的文件上传依赖于Apache的Commons FileUpload库。在配置Struts2的Action类时,需要引入相应的依赖,并在Action类中定义一个类型的字段来...

    struts2实现多文件上传下载

    网上的Struts2进行的文件下载一般都是单文件或者固定的文件,并没有(很少)实现随意文件的下载的例子 提供多文件上传,上传成功后,提供刚上传的文件下载功能(其他的都可以在其上面进行扩充) 多文件 上传 下载...

    基于Struts1.2的上传下载Demo

    本项目"基于Struts1.2的上传下载Demo"是针对该框架的一个实践示例,旨在帮助开发者理解和解决在Struts1.2环境中进行文件上传与下载的问题。 首先,让我们深入了解一下Struts1.2中的文件上传功能。在Struts1.2中,...

    JavaEE Struts文件上传

    通过分析这些文件,你可以看到一个完整的Struts2文件上传应用的结构和实现细节。 学习Struts2文件上传不仅需要掌握上述概念和技术,还需要了解文件安全性、异常处理和服务器配置等相关知识。在实际应用中,确保文件...

    struts上传与下载

    Struts是Apache软件基金会下的一个开源框架,主要应用于Java Web应用程序的开发。...在Struts中,文件上传和下载是常见的功能需求,...理解这些概念并熟练运用,你就能在Struts框架下实现高效且安全的文件上传和下载功能。

    struts2真正实现上传下载完整源代码

    本文将深入探讨如何使用Struts2来实现这一功能,并结合提供的"struts2真正实现上传下载完整源代码"进行分析。 首先,我们要了解Struts2中文件上传的基本原理。它主要依赖于Apache的Commons FileUpload库,该库处理...

    Struts2实现文件的上传下载

    总的来说,Struts2通过内置的拦截器和便捷的API,使得文件上传下载变得简单而高效。尽管本项目没有使用异步(AJAX)方式,但在实际应用中,结合AJAX进行无刷新的文件上传和下载也是常见的优化手段,可以提升用户体验...

    基于Struts2的文件上传下载功能的完整源代码。

    在基于Struts2的文件上传下载功能中,它提供了处理用户上传文件和提供文件下载的服务。这个完整的源代码是实现这些功能的一个实例,经过测试确保了其正确性和可用性。 首先,我们要理解Struts2中的Action类。Action...

    struts1和struts2分别实现文件上传下载功能

    总的来说,Struts1和Struts2在文件上传下载上的实现各有特点,Struts1更注重于配置,而Struts2则提供了更为灵活的编程模型。理解这两个框架的处理机制有助于你更好地实现和优化Web应用中的文件操作功能。在实际项目...

Global site tag (gtag.js) - Google Analytics