struts1 上传下载
FileAction.java
?
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
<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>