当前位置: 代码迷 >> J2EE >> struts上传下载图片,该怎么解决
  详细解决方案

struts上传下载图片,该怎么解决

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

 

首先建立一个FileAction
Java code
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>
  相关解决方案