struts上传下载

以下是接收参数的actionForm

package com.cs.formbean;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.upload.FormFile;

public class FileUpActionForm extends ActionForm {
private String title ;
private FormFile upfile ;


public String getTitle() {
return title;
}
public void setTitle(String title) {

this.title = title;
}
public FormFile getUpfile() {
return upfile;
}
public void setUpfile(FormFile upfile) {
this.upfile = upfile;
}
@Override
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
//可以在此判断文件的后缀名,用来阻挡不合格的上传文件
return super.validate(mapping, request);
}

}


fileup.jsp

<%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title>Insert title here</title>
</head>
<body>
<form action="fileup.do" method="post" enctype="multipart/form-data" >
标题:<input type="text" name="title" /><br>
文件:<input type="file" name="upfile" /><br>
<input type="submit" value="上传" >

</form>


</body>
</html>


action中的上传

private Share saveUpFile(FileUpActionForm taform ) {

//upfile封装在了FileUpActionForm 中的upfile属性


//定义流对象,这里用的是缓冲流
FileOutputStream fos = null ;
InputStream is = null ;
BufferedInputStream bis = null;
BufferedOutputStream bos = null;

try {
//获取upfile对象
FormFile formFile = taform.getUpfile() ;
//建立文件流
File newFile = new File ("d:\\share\\"+formFile.getFileName()) ;


fos = new FileOutputStream(newFile) ;

is = formFile.getInputStream() ;
bis = new BufferedInputStream(is) ;
bos = new BufferedOutputStream(fos) ;
//缓冲区定义为4K
byte[] buffer = new byte[8192];
int bytesRead = 0;
while ((bytesRead = bis.read(buffer, 0, 8192)) != -1) {
bos.write(buffer, 0, bytesRead);

}

} catch (FileNotFoundException e) {
throw new SystemException("文件目录不存在");
} catch (IOException e) {
throw new SystemException("上传失败!");
}finally{
try {
bos.flush();
fos.close();
is.close();
bis.close();
bos.close();
} catch (IOException e) {
throw new SystemException("关闭IO流遇到异常") ;
}
}
shareMgr.addFile(share) ;
return share ;
}



下载:
假定存在资源文件d:\\share目录
在struts的Action中的下载方法
前提,上传的时候,在数据库中存的只是资源文件的路径,所以从数据库中读取到的是路径
而非真正的文件

public ActionForward download(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
{
/*
* 下载需要三个参数
* 1.path:建立文件流的时候获取路径
* 2.name:下载到本地想自己改个名字,所以要获取本地名
* 3.size:可要可不要
*/
//建立流对象
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
OutputStream fos = null;
InputStream fis = null;


FileUpActionForm taform = (FileUpActionForm)form ;
//这里存在中文乱码的问题
//所以要先读取路径的前半部分
String path = taform.getPath().substring(0, taform.getPath().lastIndexOf("\\")) ;
//下载的时候,下载到本地的名称由用户输入,且封装在了
//FileUpActionForm 中的name中
try {
//转码
path = path +"\\"+ new String(taform.getName().getBytes("iso8859-1"),"gbk") ;
} catch (UnsupportedEncodingException e1) {
throw new SystemException("不支持的编码转换") ;
}
System.out.println("path = "+path);

File downfile = new File(path) ;
if(!downfile.exists()){
throw new SystemException("文件不存在") ;
}

int size = (int)taform.getSize() ;
//如果是从服务器上取就用这个获得系统的绝对路径方法。

try {
fis = new FileInputStream(downfile) ;
bis = new BufferedInputStream(fis);

//首先要拿到这个流对象 ,然后才能写到本地去
fos = response.getOutputStream();
bos = new BufferedOutputStream(fos);

//这个就就是弹出下载对话框的关键代码
response.setContentType("application/x-msdownload");
response.setHeader("Content-disposition",
"attachment;filename=" +
URLEncoder.encode(path, "utf-8"));
response.setContentLength(taform.getSize());

int bytesRead = 0;
//用输入流进行先读,然后用输出流去写(缓冲输入输出流)
byte[] buffer = new byte[8192];
while ((bytesRead = bis.read(buffer, 0, 8192)) != -1) {
bos.write(buffer, 0, bytesRead);

}

} catch (FileNotFoundException e) {
throw new SystemException("文件没找到") ;
} catch (UnsupportedEncodingException e) {
throw new SystemException("不支持的编码转换") ;
} catch (IOException e) {
throw new SystemException("I/O异常") ;
} finally{
try {
bos.flush();
fis.close();
bis.close();
fos.close();
bos.close();
} catch (IOException e) {
throw new SystemException("关闭IO流遇到异常") ;
}

}

return mapping.findForward("share") ;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值