`

struts上传下载

阅读更多

最近要做上传下载,所以又把它翻出了,熟悉了一把,做了一下字节转换的调整及上传类型的限制,当然还有上传路径的限制。不过一直在考虑的问题是怎样找到减少服务器压力的具体方法,本列子贴出来是希望能给某些新手一些帮助,同时也希望各路大侠批评指点小弟的许多不足。

 

首先建立一个FileAction

package com.action;
import org.apache.struts.action.*;
import javax.servlet.http.*;
import com.actionForm.FileActionForm;
import org.apache.struts.actions.DispatchAction;
import java.util.Date;
import java.text.*;
import org.apache.struts.upload.FormFile;
import java.io.*;
import java.net.URLEncoder;
import com.dao.*;

public class FileAction extends DispatchAction {

    private JDBConnection connection =new JDBConnection();
//以下方法实现文件的上传
    public ActionForward upLoadFile(ActionMapping mapping, ActionForm form,
                                    HttpServletRequest request,
                                    HttpServletResponse response) throws
            Exception {
     ActionForward forward=null;
        Date date = new Date();
        FileActionForm fileActionForm = (FileActionForm) form;
        //FormFile用于指定存取文件的类型
        FormFile file = fileActionForm.getFile(); //获取当前的文件
      // 获得系统的绝对路径  String dir = servlet.getServletContext().getRealPath("/image");
        //我上传的文件没有放在服务器上。而是存在D:D:\\loadfile\\temp\\
        String dir="D:\\loadfile\\temp\\";
        int i = 0;
  String type = file.getFileName();
  while(i!=-1){
   //找到上传文件的类型的位置,这个地方的是'.'
   i = type.indexOf(".");
  /* System.out.println(i);*/
   /*截取上传文件的后缀名,此时得到了文件的类型*/
   type = type.substring(i+1);
  }
  // 限制上传类型为jpg,txt,rar;
  if (!type.equals("jpg") && !type.equals("txt")&& !type.equals("bmp"))
   
  {//当上传的类型不为上述类型时,跳转到错误页面。
    forward=mapping.findForward("error");
  }
  else
  {  
//    将上传时间加入文件名(这个地方的是毫秒数)   
     String times = String.valueOf(date.getTime());
    //组合成 time.type
         String  fname = times + "." + type;
       //InInputStream是用以从特定的资源读取字节的方法。
          InputStream streamIn = file.getInputStream();    //创建读取用户上传文件的对象
          //得到是字节数,即byte,我们可以直接用file.getFileSize(),也可以在创建读取对象时用streamIn.available();
         // int ok=streamIn.available();          
          int ok=file.getFileSize();
          String strFee = null;
          //这个地方是处理上传的为M单位计算时,下一个是以kb,在下一个是byte;
         
          if(ok>=1024*1024)
          {
           float ok1=(((float)ok)/1024f/1024f); 
           DecimalFormat myformat1 = new DecimalFormat("0.00");        
          strFee = myformat1.format(ok1)+"M";
                 System.out.println(strFee+"M");
          }
          else if(ok>1024 && ok<=1024*1024)
          {
             double  ok2=((double)ok)/1024;
             DecimalFormat myformat2=new DecimalFormat("0.00");
            strFee = myformat2.format(ok2)+"kb";
                 System.out.println(strFee+"kb");
          }
          else if(ok<1024)
          {
           System.out.println("aaaaaaaaa");
           strFee=String.valueOf(ok)+"byte";
           System.out.println(strFee);
          
          }
          System.out.println( streamIn.available()+"文件大小byte");
          //这个是io包下的上传文件类
          File uploadFile = new File(dir);   //指定上传文件的位置
          if (!uploadFile.exists() || uploadFile == null) {  //判断指定路径dir是否存在,不存在则创建路径
              uploadFile.mkdirs();
          }
          //上传的路径+文件名
          String path = uploadFile.getPath() + "\\" + fname;
       //OutputStream用于向某个目标写入字节的抽象类,这个地方写入目标是path,通过输出流FileOutputStream去写
          OutputStream streamOut = new FileOutputStream(path);
          int bytesRead = 0;
          byte[] buffer = new byte[8192];
          //将数据读入byte数组的一部分,其中读入字节数的最大值是8192,读入的字节将存储到,buffer[0]到buffer[0+8190-1]的部分中
          //streamIn.read方法返回的是实际读取字节数目.如果读到末尾则返回-1.如果bytesRead返回为0则表示没有读取任何字节。
          while ((bytesRead = streamIn.read(buffer, 0, 8192)) != -1) {
           //写入buffer数组的一部分,从buf[0]开始写入并写入bytesRead个字节,这个write方法将发生阻塞直至字节写入完成。
              streamOut.write(buffer, 0, bytesRead);
          }
        //  关闭输出输入流,销毁File流。
          streamOut.close();
          streamIn.close();
          file.destroy();    
          String paths=path;
          System.out.println(paths);
         String fileName = Chinese.toChinese(fileActionForm.getFileName()); //获取文件的名称
        //String fileSize = String.valueOf(file.getFileSize());
         String fileDate = DateFormat.getDateInstance().format(date);
         String sql = "insert into tb_file values('" + fileName + "','" +
         strFee + "','" + fileDate + "','" + paths + "')";

         connection.executeUpdate(sql);
         connection.closeConnection();
         forward=mapping.findForward("upLoadFileResult");
  }
        return forward;
    }
    //实现文件的下载
    public ActionForward downFile(ActionMapping mapping, ActionForm form,
                                  HttpServletRequest request,
                                  HttpServletResponse response) throws
            Exception {
        String path = request.getParameter("path");
        System.out.println(path+"111");
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        OutputStream fos = null;
        InputStream fis = null;
       
      //如果是从服务器上取就用这个获得系统的绝对路径方法。  String filepath = servlet.getServletContext().getRealPath("/" + path);
        String  filepath=path;
        System.out.println("文件路径"+filepath);
        File uploadFile = new File(filepath);
        fis = new FileInputStream(uploadFile);
        bis = new BufferedInputStream(fis);
        fos = response.getOutputStream();
        bos = new BufferedOutputStream(fos);
        //这个就就是弹出下载对话框的关键代码
        response.setHeader("Content-disposition",
                           "attachment;filename=" +
                           URLEncoder.encode(path, "utf-8"));
        int bytesRead = 0;
        //这个地方的同上传的一样。我就不多说了,都是用输入流进行先读,然后用输出流去写,唯一不同的是我用的是缓冲输入输出流
        byte[] buffer = new byte[8192];
        while ((bytesRead = bis.read(buffer, 0, 8192)) != -1) {
            bos.write(buffer, 0, bytesRead);
        }
        bos.flush();
        fis.close();
        bis.close();
        fos.close();
        bos.close();
        return null;
    }

}

FileActionForm

     

package com.actionForm;

import org.apache.struts.action.*;
import org.apache.struts.upload.*;

public class FileActionForm extends ActionForm {
    private String fileName;//上传文件的名称
    private String fileSize;//上传文件的大小
    private String filePath;//上传文件到服务器的路径
    private String fileDate;//上传文件的日期
    private FormFile file;//上传文件

    public String getFileName() {
        return fileName;
    }

    public FormFile getFile() {
        return file;
    }

    public String getFileSize() {
        return fileSize;
    }

    public String getFilePath() {
        return filePath;
    }

    public String getFileDate() {
        return fileDate;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    public void setFile(FormFile file) {
        this.file = file;
    }

    public void setFileSize(String fileSize) {
        this.fileSize = fileSize;
    }

    public void setFilePath(String filePath) {
        this.filePath = filePath;
    }

    public void setFileDate(String fileDate) {
        this.fileDate = fileDate;
    }

}

index.jsp  此位置的form是javabeen的对象,这个javabeen中存取的图片的相关信息

<table width="264" height="81" border="0" align="center" cellpadding="0" cellspacing="0">
                <tr>
                  <td width="115"  rowspan="4" align="center"><img src="<%=form.getFilePath()%>" width="100" height="100"></td>
                  <td width="133" align="center">图片名称:<%=form.getFileName()%></td>
                </tr>
                <tr align="center">
                  <td>图片大小:<%=form.getFileSize()%></td>
                </tr>
                <tr align="center">
                  <td>上传日期:<%=form.getFileDate()%></td>
                </tr>
                <tr>
                  <td align="center"><a href="fileAction.do?method=downFile&path=<%=form.getFilePath()%>" ><img src="priture/bottond.jpg"></a>


                  </td>
                </tr>
            </table>

<html:form action="fileAction.do?method=upLoadFile" enctype="multipart/form-data" onsubmit="return Mycheck()">
        <table height="52" border="0" align="center" cellpadding="0" cellspacing="0">
          <tr align="center">
            <td width="60" height="26">图片名称:</td>
            <td width="160"> <html:text property="fileName"/> </td>
            <td width="60">图片路径:</td>
            <td width="198"> <html:file property="file"/> </td>
          </tr>
          <tr align="right">
            <td height="26" colspan="4"> <html:submit>上传</html:submit> </td>
          </tr>
        </table>
  </html:form>

struts-config.xml  

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">

<struts-config>
  <form-beans>
    <form-bean name="fileActionForm" type="com.actionForm.FileActionForm" />
  </form-beans>
  <action-mappings>
    <action name="fileActionForm" parameter="method" path="/fileAction" scope="request" type="com.action.FileAction" validate="true">
        <forward name="upLoadFileResult" path="/result.jsp"/>
        <forward name="error" path="/fail.jsp"></forward>
    </action>
  </action-mappings>
  <message-resources parameter="ApplicationResources" />
</struts-config>

 

 

http://www.bitscn.com/java/spring/200605/23081.html ssh长传与下载
分享到:
评论
14 楼 wm920 2008-12-19  

好!讲的清澈
13 楼 yanghaiskys 2008-10-30  
zhangyou1010 写道

下载直接读的服务器上的文件吗? 下载的是哪个文件呢,好像没看到传文件名给下载的部分啊。

如果上传到服务器上是
  // 获得系统的绝对路径  String dir = servlet.getServletContext().getRealPath("/image");
  //这个是io包下的上传文件类
          File uploadFile = new File(dir);   //指定上传文件的位置
          if (!uploadFile.exists() || uploadFile == null) {  //判断指定路径dir是否存在,不存在则创建路径
             uploadFile.mkdirs();
          }
12 楼 yanghaiskys 2008-10-30  
zhangyou1010 写道

下载直接读的服务器上的文件吗? 下载的是哪个文件呢,好像没看到传文件名给下载的部分啊。

下载的在这个地方,我用的是一个图片
<a href="fileAction.do?method=downFile&path=<%=form.getFilePath()%>" ><img src="priture/bottond.jpg"></a>
      // 获得系统的绝对路径  String dir = servlet.getServletContext().getRealPath("/image");
        //我上传的文件没有放在服务器上。而是存在D:D:\\loadfile\\temp\\
        String dir="D:\\loadfile\\temp\\";
你仔细看
11 楼 yanghaiskys 2008-10-30  
avanry 写道

看见你做得非常好,想做一下,但是我用的是ssh三层架构,怎么样才能把和数据库有关的内容加入到hibernate中呢?你觉得可以实现吗?谢谢

完全可以,这个与hibernate无关,你会做ssh,就会做这个,和平时做的没什么两样
10 楼 shanxmxj 2008-10-20  
sofa  
9 楼 xiaocheng 2008-09-27  
if else用的太多了。换种写法啊。
8 楼 avanry 2008-09-27  
看见你做得非常好,想做一下,但是我用的是ssh三层架构,怎么样才能把和数据库有关的内容加入到hibernate中呢?你觉得可以实现吗?谢谢
7 楼 xiaoxue3333 2008-09-09  
真不错,谢谢,学习中......
6 楼 lovinchan 2008-08-09  
赞备注精神,不过代码的格式还需要调整一下,呵呵   `````
5 楼 yanghaiskys 2008-07-30  
哦,对不起,我这个地方下载的地方没注明,这个地方放的是一个下载按钮图片 
<td align="center"><a href="fileAction.do?method=downFile&path=<%=form.getFilePath()%>" ><img src="priture/bottond.jpg"></a>
注意下,我这个地方的path是从数据库里获得的,即我上传的时候,保存的图片路径
4 楼 yanghaiskys 2008-07-30  
  传文件的部分是 红色区域,我上传到的本地磁盘D盘中,如果上传到服务器只要改一下就可以。写的很清楚你仔细看

<html:form action="fileAction.do?method=upLoadFile" enctype="multipart/form-data" onsubmit="return Mycheck()">
        <table height="52" border="0" align="center" cellpadding="0" cellspacing="0">
          <tr align="center">
            <td width="60" height="26">图片名称:</td>
            <td width="160"> <html:text property="fileName"/> </td>
            <td width="60">图片路径:</td>
            <td width="198"> <html:file property="file"/> </td>
          </tr>
          <tr align="right">
            <td height="26" colspan="4"> <html:submit>上传</html:submit> </td>
          </tr>
        </table>
  </html:form>

如果上传到服务器上是
  // 获得系统的绝对路径  String dir = servlet.getServletContext().getRealPath("/image");
  //这个是io包下的上传文件类
          File uploadFile = new File(dir);   //指定上传文件的位置
          if (!uploadFile.exists() || uploadFile == null) {  //判断指定路径dir是否存在,不存在则创建路径
             uploadFile.mkdirs();
          }




  
3 楼 zhangyou1010 2008-07-29  
下载直接读的服务器上的文件吗? 下载的是哪个文件呢,好像没看到传文件名给下载的部分啊。
2 楼 javaz 2008-07-28  
学习一下!
1 楼 hank31713 2008-07-25  
楼主辛苦了,顶一个。。。

相关推荐

    Struts 上传下载

    Struts上传 #### 1.1 ActionForm 在Struts中,`ActionForm` 类是用于收集用户输入的数据。对于文件上传,我们需要创建一个继承自 `org.apache.struts.upload.FormFile` 的类,例如 `UploadForm`,在这个类中定义一...

    struts上传下载源代码

    以下是对Struts上传下载源代码的详细解释: 1. **struts-config.xml配置**: 在Struts配置文件`struts-config.xml`中,可以看到针对上传、下载、列表和删除操作的四个`&lt;action&gt;`元素。这些元素定义了不同操作的...

    struts上传下载实例

    在这个"Struts上传下载实例"中,我们将会探讨如何在Struts框架下实现文件的上传和下载功能,这对于开发涉及用户交互和数据交换的Web应用来说至关重要。 首先,让我们了解上传功能。在Struts中,文件上传主要依赖于`...

    struts上传下载例子

    这个"struts上传下载例子"展示了如何在Struts中实现文件上传和下载的功能,这对于任何处理用户数据交互的Web应用都是必不可少的。下面我们将深入探讨相关知识点。 首先,我们来理解MVC模式。在MVC架构中,模型...

    struts上传下载完整dome

    在本"struts上传下载完整dome"中,我们将深入探讨如何在Struts框架下实现文件的上传与下载功能。 一、Struts2文件上传 1. **依赖库**:Struts2的文件上传功能依赖于`commons-fileupload`和`commons-io`两个库。你...

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

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

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

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

    struts上传与下载

    在Struts中,文件上传和下载是常见的功能需求,尤其在构建动态网站或Web应用时。 文件上传是指用户通过网页界面将本地文件发送到服务器的过程。在Struts中,这通常涉及到以下关键知识点: 1. **ActionForm**:...

    Struts上传下载范例

    接着是`struts1和struts2分别实现文件上传下载.rar`,这个文件涵盖了Struts 1和Struts 2两个版本的实现。Struts 1与Struts 2在处理文件上传的方式上有一些不同。在Struts 1中,文件上传通常通过`FileUploadAction`或...

    struts2上传下载实例

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

    java的Struts上传下载代码及jar包

    在Struts2进行文件上传下载时,可能需要以下jar包: - `struts2-core.jar`:Struts2的核心库,包含Action、Result等核心组件。 - `xwork-core.jar`:XWork框架的库,Struts2是基于XWork构建的。 - `struts2-...

    struts框架-文件上传下载

    Struts框架是Java Web开发中常用的一个开源MVC框架,由Apache软件基金会维护...以上是对Struts框架中文件上传下载功能的详细解析,希望对你理解这一主题有所帮助。如需进一步讨论,可以加入指定的QQ群或通过邮件联系。

    Struts上传下载

    下面将详细讲解Struts实现文件上传下载的原理和步骤。 ### 文件上传 1. **依赖库**:首先,需要引入Apache的Commons FileUpload和Commons IO库。这两个库提供了处理文件上传的功能。 2. **配置struts.xml**:在...

    用struts和jdbc做的一个上传下载系统

    在这个"用struts和jdbc做的一个上传下载系统"中,我们可以看到Struts框架被用来处理用户请求,实现上传和下载功能,而JDBC(Java Database Connectivity)则用于与数据库进行交互,存储和检索文件信息。 首先,...

    struts上传下载文件

    在Struts框架中,实现文件上传和下载功能是常见的需求,尤其在处理用户交互、数据交换等方面。 一、文件上传 1. **原理**:文件上传主要涉及到HTTP协议中的multipart/form-data编码类型。在HTML表单中,通过设置`...

    struts上传下载(包含单个文件和多个文件)

    1.直接import到MyEclipse直接运行。 2.包含上传一个文件和多个文件 3.struts上传 用到包commons-fileupload-1.2.1.jar commons-io-1.4.jar(项目中已经有) 4.附带图片

    struts上传下载详细代码

    在Struts框架中,处理文件上传和下载是常见的功能需求。下面,我们将详细讨论Struts中实现文件上传和下载的关键知识点。 一、文件上传 1. **配置Struts2核心过滤器**:在web.xml中,我们需要配置`FilterDispatcher...

    Struts文件的上传和下载

    在Struts框架中,文件的上传和下载是常见的功能需求,用于实现用户交互,如上传图片、文档等,或者提供资源的下载服务。下面将详细探讨Struts中文件上传和下载的实现机制。 一、文件上传 1. 配置文件:在Struts2中...

Global site tag (gtag.js) - Google Analytics