在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了。作为个程序员来说,它应该是追求完美的,但是我认为效率和时间是个凸函数,并不是但方面的极致就是最好,两者的最佳切合点才是最好。
分享到:
相关推荐
总结起来,使用Struts实现文件上传下载涉及前端表单设计、后端处理逻辑、文件存储策略以及安全控制等多个方面。在实践中,我们还需要考虑到性能优化和用户体验提升,例如使用异步上传、进度条展示等技术。
综上所述,使用Struts实现文件上传和下载需要对HTTP协议、Servlet、Struts框架以及文件I/O操作有深入理解。通过合理配置和编写代码,可以轻松地在Web应用中集成这些功能。如果你遇到了具体的编程问题,可以查阅提供...
在实现上传下载之前,确保你的项目已经集成了Struts2框架,并且配置了相应的struts.xml配置文件。配置文件中需要包含Action的定义,这些Action将处理上传和下载请求。 2. **上传文件**: - **表单设计**:在HTML...
Struts2是一个强大的MVC(模型-视图-控制器)框架,广泛应用于Java ...以上就是使用Struts2框架实现文件上传下载的基本步骤和关键知识点。在实际开发中,可以根据项目需求进行调整和优化,确保功能的稳定性和安全性。
这篇博客文章提供的"struts2文件上传下载源代码"旨在帮助开发者理解和实现这些功能。 文件上传功能允许用户从他们的设备上传文件到服务器。在Struts2中,这通常通过表单实现,表单包含一个`<input type="file">`...
在这个"struts实现文件上传和下载源代码"项目中,我们将会探讨如何使用Struts框架来实现在Web应用中进行文件的上传和下载功能,同时还会关注对于大文件(超过3MB)的处理策略。 1. **文件上传** 文件上传是Web应用...
提供的压缩文件`struts实现上传下载源码及文档`应该包含了完整的实现示例,包括Action类、ActionForm、JSP页面以及使用说明。通过阅读源码和文档,你可以更深入地理解如何在实际项目中应用这些技术。 总之,解决...
本文将深入探讨如何使用Struts框架实现图片上传功能,这在许多Web应用中都是一个常见且重要的需求。 ### Struts框架简介 Struts是一个开源的框架,用于创建企业级的Java Web应用。它基于Servlet和JSP技术,并遵循...
本篇文章将详细讲解如何利用Struts2.2和Hibernate3.6实现文件的上传与动态下载。 **一、文件上传** 1. **环境配置**:首先,你需要一个集成开发环境,例如MyEclipse8.6,并安装所需的Struts2.21、JUnit4.8.2以及...
在"struts2上传下载项目"中,我们可以深入理解如何利用Struts2实现文件的上传与下载功能。 首先,上传功能在Web应用中十分常见,比如用户在注册时上传头像,或者提交文档等。在Struts2中,我们主要借助`struts2-...
下面将详细介绍Struts 实现文件上传的相关知识点。 ### 1. Struts 框架概述 Struts 是Apache软件基金会下的一个开源项目,其主要目标是提供一个可扩展且易于维护的架构,用于构建企业级的Java Web应用。它通过分离...
这个"struts2_上传下载"实例则涵盖了多种实现这些功能的方法。 首先,Struts2的文件上传依赖于Apache的Commons FileUpload库。在配置Struts2的Action类时,需要引入相应的依赖,并在Action类中定义一个类型的字段来...
网上的Struts2进行的文件下载一般都是单文件或者固定的文件,并没有(很少)实现随意文件的下载的例子 提供多文件上传,上传成功后,提供刚上传的文件下载功能(其他的都可以在其上面进行扩充) 多文件 上传 下载...
本项目"基于Struts1.2的上传下载Demo"是针对该框架的一个实践示例,旨在帮助开发者理解和解决在Struts1.2环境中进行文件上传与下载的问题。 首先,让我们深入了解一下Struts1.2中的文件上传功能。在Struts1.2中,...
通过分析这些文件,你可以看到一个完整的Struts2文件上传应用的结构和实现细节。 学习Struts2文件上传不仅需要掌握上述概念和技术,还需要了解文件安全性、异常处理和服务器配置等相关知识。在实际应用中,确保文件...
Struts是Apache软件基金会下的一个开源框架,主要应用于Java Web应用程序的开发。...在Struts中,文件上传和下载是常见的功能需求,...理解这些概念并熟练运用,你就能在Struts框架下实现高效且安全的文件上传和下载功能。
本文将深入探讨如何使用Struts2来实现这一功能,并结合提供的"struts2真正实现上传下载完整源代码"进行分析。 首先,我们要了解Struts2中文件上传的基本原理。它主要依赖于Apache的Commons FileUpload库,该库处理...
总的来说,Struts2通过内置的拦截器和便捷的API,使得文件上传下载变得简单而高效。尽管本项目没有使用异步(AJAX)方式,但在实际应用中,结合AJAX进行无刷新的文件上传和下载也是常见的优化手段,可以提升用户体验...
在基于Struts2的文件上传下载功能中,它提供了处理用户上传文件和提供文件下载的服务。这个完整的源代码是实现这些功能的一个实例,经过测试确保了其正确性和可用性。 首先,我们要理解Struts2中的Action类。Action...
总的来说,Struts1和Struts2在文件上传下载上的实现各有特点,Struts1更注重于配置,而Struts2则提供了更为灵活的编程模型。理解这两个框架的处理机制有助于你更好地实现和优化Web应用中的文件操作功能。在实际项目...