请教下高手如何在java WEB中 实现文件下载功能~ 最好写出注释。。谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 smartupload,apache,或者是struts框架都能实现文件下载功能具体你可以去百度下。最好找本书或视频看下!!! String path=request.getParameter("path");//从页面获取要下载的文件的相对路径 if(!"".equals(path)){ path=new String(path.getBytes("ISO-8859-1"),"UTF-8"); File file=new File(getServletContext().getRealPath("/")+path);//构造要下载的文件 if(file.exists()){ InputStream ins=new FileInputStream(getServletContext().getRealPath("/")+path);//构造一个读取文件的IO流对象 BufferedInputStream bins=new BufferedInputStream(ins);//放到缓冲流里面 OutputStream outs=response.getOutputStream();//获取文件输出IO流 BufferedOutputStream bouts=new BufferedOutputStream(outs); response.setContentType("application/x-download");//设置response内容的类型 response.setHeader("Content-disposition","attachment;filename="+ URLEncoder.encode(path, "UTF-8"));//设置头部信息 int bytesRead = 0; byte[] buffer = new byte[8192]; //开始向网络传输文件流 while ((bytesRead = bins.read(buffer, 0, 8192)) != -1) { bouts.write(buffer, 0, bytesRead); } bouts.flush();//这里一定要调用flush()方法 ins.close(); bins.close(); outs.close(); bouts.close(); }else{ System.out.println("下载的文件不存在"); } }else{ System.out.println("下载文件时参数错误"); } 上传:package com.wb.ekeng.web.action.file;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import org.apache.struts.action.ActionForm;import org.apache.struts.action.ActionForward;import org.apache.struts.action.ActionMapping;import org.apache.struts.action.ActionMessages;import com.wb.ekeng.ebo.BO_File;import com.wb.ekeng.info.INFO_Admin;import com.wb.ekeng.info.INFO_File;import com.wb.ekeng.web.action.BaseAction;import com.wb.ekeng.web.filemanage.File;import com.wb.ekeng.web.filemanage.SmartUpload;import com.wb.ekeng.web.util.Convertor;public class ACT_AddFile extends BaseAction { public ACT_AddFile() { super(); } public ActionForward doExcute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response, ActionMessages errors) throws Exception { //文件保存路径 String strSavePath ="/upload/file/"; //允许上传的文件类型 String strAllowExt ="jpg,jpeg,gif,bmp,txt,java"; //允许上传最大字节数 int maxSize =1048576; //上传文件 SmartUpload upload=new SmartUpload(); upload.initialize(this.getServlet().getServletConfig(), request, response); upload.upload("UTF-8"); //获取文件 String[] allowExtList =strAllowExt.split(","); File fileBuffer =upload.getFiles().getFile(0); if(fileBuffer.isMissing()){ throw new Exception("error.act.act_addfile.error3"); } HttpSession session=request.getSession(); INFO_Admin loginAdmin=(INFO_Admin) session.getAttribute("loginadmin"); Long lAdminId=loginAdmin.getId(); String strName=upload.getRequest().getParameter("name"); //如果遇见上传中文文件出现乱码问题,上一句可以改成这样(其他语句参照这): String strName=new String(upload.getRequest().getParameter("name").getBytes(),"UTF-8"); String strNeedPoint=upload.getRequest().getParameter("needpoint"); String strType=upload.getRequest().getParameter("type"); String strDes=upload.getRequest().getParameter("des"); Integer iNeedPoint=null; //验证参数 if(strName==null||strNeedPoint==null||strType==null||strDes==null){ throw new Exception("error.common.badrequest"); } this.doValidate(errors,INFO_File.validateName(strName)); this.doValidate(errors,INFO_File.validateNeedPoint(strNeedPoint)); this.doValidate(errors,INFO_File.validateType(strType)); this.doValidate(errors,INFO_File.validateDes(strDes)); //验证文件大小 int FileSize=fileBuffer.getSize(); if(FileSize>maxSize){ this.doValidate(errors,"error.act.act_addfile.error2"); } //验证文件类型 String strFileExt =fileBuffer.getFileExt(); boolean flag =false; for(int i=0;i<allowExtList.length;i++) { if(allowExtList[i].toLowerCase().equals(strFileExt.toLowerCase())){ //找到了匹配的后缀 flag=true; } } if(strFileExt.equals("") || flag ==false){ this.doValidate(errors,"error.act.act_addfile.error1"); } if(!errors.isEmpty()){ System.out.println(errors.toString()); return null; } //参数转换 strName =Convertor.convertHalfToFull(strName); iNeedPoint=new Integer(strNeedPoint); Integer iFileSize=Integer.valueOf(FileSize); //构造saveName String strSaveName=lAdminId+"_"+BO_File.getNowString()+"."+upload.getFiles().getFile(0).getFileExt(); fileBuffer.saveAs(strSavePath + strSaveName); //提交数据 BO_File boFile=new BO_File(); boFile.addFile(strName,strType,strDes,strSaveName,iNeedPoint,lAdminId,iFileSize); return new ActionForward("/admin/main/download/admindownload.do",true); }} 下载:package com.wb.ekeng.web.action.file;import java.util.ArrayList;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import org.apache.struts.action.ActionForm;import org.apache.struts.action.ActionForward;import org.apache.struts.action.ActionMapping;import org.apache.struts.action.ActionMessages;import com.wb.ekeng.web.action.BaseAction;import com.wb.ekeng.ebo.BO_File;import com.wb.ekeng.info.INFO_File;import com.wb.ekeng.info.INFO_User;import com.wb.ekeng.web.filemanage.SmartUpload;/** * 备注: * 文件下载Action * 输入: * String fileid * String userid * 输出: */public class ACT_Download extends BaseAction { public ACT_Download() { super(); } public ActionForward doExcute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response, ActionMessages errors) throws Exception { HttpSession session =request.getSession(); //获取参数 Long lFileId=null; String fileId =request.getParameter("fileid"); INFO_User infoUser=(INFO_User)session.getAttribute("loginuser"); //验证参数 if(fileId==null || infoUser.getId() ==null){ throw new Exception("error.common.badrequest"); } lFileId=new Long(fileId); BO_File boFile=new BO_File(); INFO_File infoFile =null; //判断用户是否为第一次下载接收存储下载资源Id的session,然后判断要下载的资源Id是否没存在于当前登录的下载页表中(即是否是第一次下载),如果是则调用下载扣除积分方法,并把这个资源的Id存入列表中。如果不是,则把标记位置false,直接下载资源,不调用扣除积分的方法。 boolean isFirstDownLoad =true; ArrayList downFileList =(ArrayList)session.getAttribute("downfilelist"); for(int index =0; index <downFileList.size(); index ++){ Long lFileIdBuffer =(Long)downFileList.get(index); if(lFileIdBuffer.longValue() ==lFileId.longValue()){ isFirstDownLoad =false; break; } } if(isFirstDownLoad){ infoFile=boFile.download(lFileId,infoUser.getId()); downFileList.add(lFileId); }else{ infoFile=boFile.getFile(lFileId); } (下面就是有关下载的代码) //新建一个SmartUpload对象 SmartUpload su = new SmartUpload(); //初始化 su.initialize(this.getServlet().getServletConfig(), request, response); //设定contentDisposition为null以禁止浏览器自动打开文件, //保证点击链接后是下载文件。若不设定,则下载的文件扩展名为 //doc时,浏览器将自动用word打开它。扩展名为pdf时, //浏览器将用acrobat打开。 su.setContentDisposition(null); //下载文件 su.downloadFile("/upload/file/"+infoFile.getSaveName()); return mapping.findForward("success"); }} 下载:package com.wb.ekeng.web.action.file;import java.util.ArrayList;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import org.apache.struts.action.ActionForm;import org.apache.struts.action.ActionForward;import org.apache.struts.action.ActionMapping;import org.apache.struts.action.ActionMessages;import com.wb.ekeng.web.action.BaseAction;import com.wb.ekeng.ebo.BO_File;import com.wb.ekeng.info.INFO_File;import com.wb.ekeng.info.INFO_User;import com.wb.ekeng.web.filemanage.SmartUpload;/** * 备注: * 文件下载Action * 输入: * String fileid * String userid * 输出: */public class ACT_Download extends BaseAction {public ACT_Download() {super();}public ActionForward doExcute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response, ActionMessages errors) throws Exception {HttpSession session =request.getSession();//获取参数Long lFileId=null;String fileId =request.getParameter("fileid");INFO_User infoUser=(INFO_User)session.getAttribute("loginuser");//验证参数if(fileId==null || infoUser.getId() ==null){throw new Exception("error.common.badrequest");}lFileId=new Long(fileId);BO_File boFile=new BO_File();INFO_File infoFile =null;//判断用户是否为第一次下载接收存储下载资源Id的session,然后判断要下载的资源Id是否没存在于当前登录的下载页表中(即是否是第一次下载),如果是则调用下载扣除积分方法,并把这个资源的Id存入列表中。如果不是,则把标记位置false,直接下载资源,不调用扣除积分的方法。boolean isFirstDownLoad =true;ArrayList downFileList =(ArrayList)session.getAttribute("downfilelist");for(int index =0; index <downFileList.size(); index ++){Long lFileIdBuffer =(Long)downFileList.get(index);if(lFileIdBuffer.longValue() ==lFileId.longValue()){isFirstDownLoad =false;break;}}if(isFirstDownLoad){infoFile=boFile.download(lFileId,infoUser.getId());downFileList.add(lFileId);}else{infoFile=boFile.getFile(lFileId);}(下面就是有关下载的代码)//新建一个SmartUpload对象SmartUpload su = new SmartUpload();//初始化su.initialize(this.getServlet().getServletConfig(), request, response);//设定contentDisposition为null以禁止浏览器自动打开文件,//保证点击链接后是下载文件。若不设定,则下载的文件扩展名为//doc时,浏览器将自动用word打开它。扩展名为pdf时,//浏览器将用acrobat打开。su.setContentDisposition(null);//下载文件su.downloadFile("/upload/file/"+infoFile.getSaveName());return mapping.findForward("success");}} 貌似到时候可以copy直接用了 加个动态时间显示咋加的? 一个简单问题 哪位高人指点一下,关于JSP上传的一个问题,, 急啊!!!!!! 提交到JSP时报错 急求教session问题(在同一机器上用两个帐户登陆后,第一个session值变成第二个用户的信息,为什么???在线等) 求助!急需Weblogic7相关学习资料 Session难题求解!!!! 我不知道如何安装tomcat,请赐教!! 求上传和下载的JSP源代码,高分相送,最好没有bean的 希望写一程序能下载网页上的数据 重赏 串口通讯读值乱码 这个也没有错误吗?为什么运行错误?
具体你可以去百度下。最好找本书或视频看下!!!
if(!"".equals(path)){
path=new String(path.getBytes("ISO-8859-1"),"UTF-8");
File file=new File(getServletContext().getRealPath("/")+path);//构造要下载的文件
if(file.exists()){
InputStream ins=new FileInputStream(getServletContext().getRealPath("/")+path);//构造一个读取文件的IO流对象
BufferedInputStream bins=new BufferedInputStream(ins);//放到缓冲流里面
OutputStream outs=response.getOutputStream();//获取文件输出IO流
BufferedOutputStream bouts=new BufferedOutputStream(outs);
response.setContentType("application/x-download");//设置response内容的类型
response.setHeader("Content-disposition","attachment;filename="+ URLEncoder.encode(path, "UTF-8"));//设置头部信息
int bytesRead = 0;
byte[] buffer = new byte[8192];
//开始向网络传输文件流
while ((bytesRead = bins.read(buffer, 0, 8192)) != -1) {
bouts.write(buffer, 0, bytesRead);
}
bouts.flush();//这里一定要调用flush()方法
ins.close();
bins.close();
outs.close();
bouts.close();
}else{
System.out.println("下载的文件不存在");
}
}else{
System.out.println("下载文件时参数错误");
}
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessages;import com.wb.ekeng.ebo.BO_File;
import com.wb.ekeng.info.INFO_Admin;
import com.wb.ekeng.info.INFO_File;
import com.wb.ekeng.web.action.BaseAction;
import com.wb.ekeng.web.filemanage.File;
import com.wb.ekeng.web.filemanage.SmartUpload;
import com.wb.ekeng.web.util.Convertor;public class ACT_AddFile extends BaseAction {
public ACT_AddFile() {
super();
} public ActionForward doExcute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response, ActionMessages errors) throws Exception {
//文件保存路径
String strSavePath ="/upload/file/";
//允许上传的文件类型
String strAllowExt ="jpg,jpeg,gif,bmp,txt,java";
//允许上传最大字节数
int maxSize =1048576;
//上传文件
SmartUpload upload=new SmartUpload();
upload.initialize(this.getServlet().getServletConfig(), request, response);
upload.upload("UTF-8");
//获取文件
String[] allowExtList =strAllowExt.split(",");
File fileBuffer =upload.getFiles().getFile(0);
if(fileBuffer.isMissing()){
throw new Exception("error.act.act_addfile.error3");
}
HttpSession session=request.getSession();
INFO_Admin loginAdmin=(INFO_Admin) session.getAttribute("loginadmin");
Long lAdminId=loginAdmin.getId();
String strName=upload.getRequest().getParameter("name");
//如果遇见上传中文文件出现乱码问题,上一句可以改成这样(其他语句参照这): String strName=new String(upload.getRequest().getParameter("name").getBytes(),"UTF-8");
String strNeedPoint=upload.getRequest().getParameter("needpoint");
String strType=upload.getRequest().getParameter("type");
String strDes=upload.getRequest().getParameter("des");
Integer iNeedPoint=null;
//验证参数
if(strName==null||strNeedPoint==null||strType==null||strDes==null){
throw new Exception("error.common.badrequest");
}
this.doValidate(errors,INFO_File.validateName(strName));
this.doValidate(errors,INFO_File.validateNeedPoint(strNeedPoint));
this.doValidate(errors,INFO_File.validateType(strType));
this.doValidate(errors,INFO_File.validateDes(strDes));
//验证文件大小
int FileSize=fileBuffer.getSize();
if(FileSize>maxSize){
this.doValidate(errors,"error.act.act_addfile.error2");
}
//验证文件类型
String strFileExt =fileBuffer.getFileExt();
boolean flag =false;
for(int i=0;i<allowExtList.length;i++) {
if(allowExtList[i].toLowerCase().equals(strFileExt.toLowerCase())){
//找到了匹配的后缀
flag=true;
}
}
if(strFileExt.equals("") || flag ==false){
this.doValidate(errors,"error.act.act_addfile.error1");
}
if(!errors.isEmpty()){
System.out.println(errors.toString());
return null;
}
//参数转换
strName =Convertor.convertHalfToFull(strName);
iNeedPoint=new Integer(strNeedPoint);
Integer iFileSize=Integer.valueOf(FileSize);
//构造saveName
String strSaveName=lAdminId+"_"+BO_File.getNowString()+"."+upload.getFiles().getFile(0).getFileExt();
fileBuffer.saveAs(strSavePath + strSaveName);
//提交数据
BO_File boFile=new BO_File();
boFile.addFile(strName,strType,strDes,strSaveName,iNeedPoint,lAdminId,iFileSize);
return new ActionForward("/admin/main/download/admindownload.do",true);
}
}
下载:
package com.wb.ekeng.web.action.file;import java.util.ArrayList;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessages;import com.wb.ekeng.web.action.BaseAction;
import com.wb.ekeng.ebo.BO_File;
import com.wb.ekeng.info.INFO_File;
import com.wb.ekeng.info.INFO_User;import com.wb.ekeng.web.filemanage.SmartUpload;/**
* 备注:
* 文件下载Action
* 输入:
* String fileid
* String userid
* 输出:
*/
public class ACT_Download extends BaseAction { public ACT_Download() {
super();
}
public ActionForward doExcute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response, ActionMessages errors) throws Exception {
HttpSession session =request.getSession();
//获取参数
Long lFileId=null;
String fileId =request.getParameter("fileid");
INFO_User infoUser=(INFO_User)session.getAttribute("loginuser");
//验证参数
if(fileId==null || infoUser.getId() ==null){
throw new Exception("error.common.badrequest");
}
lFileId=new Long(fileId);
BO_File boFile=new BO_File();
INFO_File infoFile =null;
//判断用户是否为第一次下载
接收存储下载资源Id的session,然后判断要下载的资源Id是否没存在于当前登录的下载页表中(即是否是第一次下载),如果是则调用下载扣除积分方法,并把这个资源的Id存入列表中。如果不是,则把标记位置false,直接下载资源,不调用扣除积分的方法。
boolean isFirstDownLoad =true;
ArrayList downFileList =(ArrayList)session.getAttribute("downfilelist");
for(int index =0; index <downFileList.size(); index ++){
Long lFileIdBuffer =(Long)downFileList.get(index);
if(lFileIdBuffer.longValue() ==lFileId.longValue()){
isFirstDownLoad =false;
break;
}
}
if(isFirstDownLoad){
infoFile=boFile.download(lFileId,infoUser.getId());
downFileList.add(lFileId);
}else{
infoFile=boFile.getFile(lFileId);
}
(下面就是有关下载的代码)
//新建一个SmartUpload对象
SmartUpload su = new SmartUpload();
//初始化
su.initialize(this.getServlet().getServletConfig(), request, response);
//设定contentDisposition为null以禁止浏览器自动打开文件,
//保证点击链接后是下载文件。若不设定,则下载的文件扩展名为
//doc时,浏览器将自动用word打开它。扩展名为pdf时,
//浏览器将用acrobat打开。
su.setContentDisposition(null);
//下载文件
su.downloadFile("/upload/file/"+infoFile.getSaveName());
return mapping.findForward("success");
}}
下载:
package com.wb.ekeng.web.action.file;import java.util.ArrayList;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessages;import com.wb.ekeng.web.action.BaseAction;
import com.wb.ekeng.ebo.BO_File;
import com.wb.ekeng.info.INFO_File;
import com.wb.ekeng.info.INFO_User;import com.wb.ekeng.web.filemanage.SmartUpload;/**
* 备注:
* 文件下载Action
* 输入:
* String fileid
* String userid
* 输出:
*/
public class ACT_Download extends BaseAction {public ACT_Download() {
super();
}
public ActionForward doExcute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response, ActionMessages errors) throws Exception {
HttpSession session =request.getSession();
//获取参数
Long lFileId=null;
String fileId =request.getParameter("fileid");
INFO_User infoUser=(INFO_User)session.getAttribute("loginuser");//验证参数
if(fileId==null || infoUser.getId() ==null){
throw new Exception("error.common.badrequest");
}
lFileId=new Long(fileId);
BO_File boFile=new BO_File();
INFO_File infoFile =null;//判断用户是否为第一次下载
接收存储下载资源Id的session,然后判断要下载的资源Id是否没存在于当前登录的下载页表中(即是否是第一次下载),如果是则调用下载扣除积分方法,并把这个资源的Id存入列表中。如果不是,则把标记位置false,直接下载资源,不调用扣除积分的方法。
boolean isFirstDownLoad =true;
ArrayList downFileList =(ArrayList)session.getAttribute("downfilelist");
for(int index =0; index <downFileList.size(); index ++){
Long lFileIdBuffer =(Long)downFileList.get(index);
if(lFileIdBuffer.longValue() ==lFileId.longValue()){
isFirstDownLoad =false;
break;
}
}
if(isFirstDownLoad){
infoFile=boFile.download(lFileId,infoUser.getId());
downFileList.add(lFileId);
}else{
infoFile=boFile.getFile(lFileId);
}
(下面就是有关下载的代码)
//新建一个SmartUpload对象
SmartUpload su = new SmartUpload();
//初始化
su.initialize(this.getServlet().getServletConfig(), request, response);
//设定contentDisposition为null以禁止浏览器自动打开文件,
//保证点击链接后是下载文件。若不设定,则下载的文件扩展名为
//doc时,浏览器将自动用word打开它。扩展名为pdf时,
//浏览器将用acrobat打开。
su.setContentDisposition(null);
//下载文件
su.downloadFile("/upload/file/"+infoFile.getSaveName());
return mapping.findForward("success");
}}