heting

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  40 随笔 :: 9 文章 :: 45 评论 :: 0 Trackbacks

 

 

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, 08192)) != -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, 08192)) != -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
<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"><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>

posted on 2009-03-04 10:36 贺挺 阅读(21113) 评论(23)  编辑  收藏

评论

# re: struts1文件上传和下载[未登录] 2010-04-08 09:28 qq
very perfit!!!  回复  更多评论
  

# re: struts1文件上传和下载 2010-06-30 17:03 ai
能给个源码例子吗  回复  更多评论
  

# re: struts1文件上传和下载 2010-10-31 11:15 路过
顶楼主!  回复  更多评论
  

# re: struts1文件上传和下载 2011-06-29 14:51 naoskang
顶楼主,非常好用  回复  更多评论
  

# re: struts1文件上传和下载[未登录] 2011-09-13 09:06 even
思路一下就清晰了  回复  更多评论
  

# re: struts1文件上传和下载 2011-12-19 20:33 asd
上传文件时??要求客户去填写???文件名????  回复  更多评论
  

# re: struts1文件上传和下载 2011-12-19 20:34 asd
如果不那样写的话。会乱码OKlahoma???  回复  更多评论
  

# re: struts1文件上传和下载[未登录] 2012-01-06 16:58 chen
非常感谢,转了、、、、、、  回复  更多评论
  

# re: struts1文件上传和下载 2012-03-06 11:10 安万军
JDBConnection这个类是那个包的?  回复  更多评论
  

# re: struts1文件上传和下载 2012-03-06 11:27 安万军
@安万军
看错了!  回复  更多评论
  

# re: struts1文件上传和下载 2012-06-30 21:41 lsc
@安万军
我没看懂这个JDBConnection,有问题,能指点一下吗  回复  更多评论
  

# re: struts1文件上传和下载 2012-06-30 22:35 lsc
@安万军
是数据库连接吗?自己写个类行不行?  回复  更多评论
  

# re: struts1文件上传和下载 2012-07-31 09:33 sinianxue
这里让用户填写名称和路径不合理,一般用户是不会同意这么做的  回复  更多评论
  

# re: struts1文件上传和下载[未登录] 2012-09-05 19:41 test
这种方法上传1m以上的doc文件会出现错误  回复  更多评论
  

# re: struts1文件上传和下载[未登录] 2012-11-30 22:35 aaa
不能直接用  回复  更多评论
  

# re: struts1文件上传和下载 2012-12-13 15:25 lvjun
垃圾  回复  更多评论
  

# re: struts1文件上传和下载 2013-03-21 11:48 000

000
  回复  更多评论
  

# re: struts1文件上传和下载 2013-06-17 20:50 yangther
asdasd  回复  更多评论
  

# re: struts1文件上传和下载 2013-06-17 20:50 yangther
Struts上传  回复  更多评论
  

# re: struts1文件上传和下载[未登录] 2013-06-28 15:02 jBoy
下载的是时候,没有考虑过中文乱码的问题。  回复  更多评论
  

# re: struts1文件上传和下载 2013-12-12 14:48
顶!!!!!!!!!!!!!!!!!!  回复  更多评论
  

# re: struts1文件上传和下载[未登录] 2014-01-22 17:38 ggg
ssgsg  回复  更多评论
  

# re: struts1文件上传和下载 2015-03-24 18:12 zuidaima
java struts框架demo使用实例教程源代码下载地址:http://zuidaima.com/share/kstruts-p1-s1.htm  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: