java后台下载服务器端文件 下载其他系统文件

本博客介绍了一个用于提供文件下载服务的Java类,通过设置响应头和读取文件流来实现文件的下载。该服务支持文件下载时的编码转换,并能处理文件不存在的情况,对于大文件提供更高效的下载方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.Writer;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

import javax.servlet.ServletOutputStream;

import cn.com.ifc.framework.business.BasicAction;

public class DownLoadAction extends BasicAction {

 /**
  *
  */
 private static final long serialVersionUID = -4011064370081237608L;

 private static final String CONTENT_TYPE = "text/html; charset=UTF-8";
 //spring配置文件注入存放文件地址
 private String fileAddr;

 public String getFileAddr() {
  return fileAddr;
 }

 public void setFileAddr(String fileAddr) {
  this.fileAddr = fileAddr;
 }

 public String doDownLoad() throws Exception {
 // getResponse().setContentType(CONTENT_TYPE);

  // 解决中文乱码问题
  // String filename = new
   String title=getRequest().getParameter("title");
    title= new String(title.getBytes("ISO8859-1"),"UTF-8");
   // title=new String(getRequest().getParameter("title").getBytes("ISO-8859-1"));
  //  title=new String(getRequest().getParameter("title").getBytes("ISO-8859-1"),"GBK");
  String gch = getRequest().getParameter("gch");
  String downname = gch+".pdf";
  String filename = title+".pdf";

  // 创建file对象
  String fileUrl = fileAddr + downname;
  File file = new File(fileUrl);
  
  //如果下载文件不存在则提示用户并且返回
  if (!file.exists()) {
   getResponse().getWriter().write("<script>alert('该文献暂时无法提供相关下载!!');window.history.back(-1);</script>");
   return null;
  }

  // 读出文件到i/o流
  FileReader fis = new FileReader(file);
  BufferedReader buff = new BufferedReader(fis);

  //判断文件长度是否大于1KB
  if (file.length() > 1024) {

   // 设置response的编码方式
   getResponse().setContentType("application/x-msdownload");

   // 写明要下载的文件的大小
   getResponse().setContentLength((int) file.length());

   // 设置附加文件名,并且解决中文乱码
   getResponse().setHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes(), "iso-8859-1"));

   // 从response对象中得到输出流,准备下载
   ServletOutputStream myout = getResponse().getOutputStream();

   FileInputStream stream=new FileInputStream(file);
   byte data[]=new byte[4096];
   int size=0;
   size=stream.read(data);//最大读取4096个字节到缓冲区read,如果stream中没有4096个则读取stream剩下的所有字节,如果一个没有那么size则为-1
   
   // 开始循环写出数据
   while (size!=-1) {
    myout.write(data,0,size);//从data[off]到data[off+size-1]即data[0至size-1]写入字节到myout输出流中,off+size不得大于data的length.将data写入输出流
    size=stream.read(data);//从输入流中给data赋值
   }
   // 将写入到客户端的内存的数据,刷新到磁盘
   myout.flush();
   myout.close();
   stream.close();
   return null;
  } else {
   //从文件中读出相关信息
   String downUrl = buff.readLine();

   //如果信息以“succ”开头则截取后面url地址
   if (downUrl.startsWith("succ")) {
    downUrl = downUrl.replace("succ", "");
    downUrl=new String(downUrl.getBytes(), "iso-8859-1");
    //add:wxj start
    // 创建URL
    URL url = null;
    URLConnection urlconn = null;
    try {
     url = new URL(downUrl);
     urlconn = url.openConnection();
   // System.out.println(urlconn.getContent());
    } catch (MalformedURLException e) {
     e.printStackTrace();
    } catch (IOException e) {
     e.printStackTrace();
    }
    HttpURLConnection httpconn = (HttpURLConnection) urlconn;

    // 不等于HTTP_OK说明连接不成功System.out.print("fail");
    if ( httpconn.getResponseCode() != HttpURLConnection.HTTP_OK) {
     try {
      System.out.println("getResponse()="+this.getResponse().getWriter());
      this.getResponse().setContentType(CONTENT_TYPE);
      this.getResponse().getWriter().write("<script>alert('该文献暂时无法提供相关下载!!');window.history.back(-1);</script>");
     } catch (IOException e) {
      e.printStackTrace();
     }
    }else{
     getResponse().getWriter().write("<script>window.location.href=\'" + downUrl + "\'</script>");
     // 新开一个线程去下载文件到服务器本地,下次再下载的时候可直接从服务器下载
     DownLoadThread downThread = new DownLoadThread();
     downThread.setDownUrl(downUrl);
     downThread.setFileAddr(fileAddr + downname);
     downThread.setResponse(getResponse());
     new Thread(downThread).start();
     
    }
    
    //add:wxj end
   } else {
    this.getResponse().setContentType(CONTENT_TYPE);
    getResponse().getWriter().write("<script>alert('该文献暂时无法提供相关下载!!');window.history.back(-1);</script>");
   }
   return null;
  }
  
 }
}

 

------------------------------------------------------------------------------------

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

import javax.servlet.http.HttpServletResponse;

import cn.com.ifc.framework.business.BasicAction;

public class DownLoadThread extends BasicAction implements Runnable {

 /**
  *
  */
 private static final long serialVersionUID = 9116090002778797074L;

 //文件地址
 private String downUrl;
 //存放文件地址
 private String fileAddr;

 //httpServletResponse
 private HttpServletResponse response;
 public String getDownUrl() {
  return downUrl;
 }

 public void setDownUrl(String downUrl) {
  this.downUrl = downUrl;
 }

 public String getFileAddr() {
  return fileAddr;
 }

 public void setFileAddr(String fileAddr) {
  this.fileAddr = fileAddr;
 }
 

 public HttpServletResponse getResponse() {
  return response;
 }

 public void setResponse(HttpServletResponse response) {
  this.response = response;
 }

 @Override
 public void run() {
  // 服务器返回的状态

  int HttpResult = 0;

  // 创建URL
  URL url = null;
  URLConnection urlconn = null;
  try {
   url = new URL(downUrl);
   urlconn = url.openConnection();
  } catch (MalformedURLException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }

/*  HttpURLConnection httpconn = (HttpURLConnection) urlconn;

  try {
   HttpResult = httpconn.getResponseCode();
  } catch (IOException e) {
   e.printStackTrace();
  }

  //System.out.println(HttpResult);

  // 不等于HTTP_OK说明连接不成功System.out.print("fail");
          System.out.println("HttpResult="+HttpResult+",downUrl="+downUrl);
  if (HttpResult != HttpURLConnection.HTTP_OK) {
   try {
    System.out.println("getResponse()="+this.getResponse().getWriter());
    this.getResponse().getWriter().write("<script>alert('连接不成功,下载失败!!')</script>");
   } catch (IOException e) {
    e.printStackTrace();
   }
  } else {*/

   // 取数据长度System.out.println(filesize);
   // int filesize = urlconn.getContentLength();

   BufferedInputStream re = null;
   BufferedOutputStream ot = null;
   try {
    re = new BufferedInputStream(urlconn.getInputStream());
    ot = new BufferedOutputStream(new FileOutputStream(fileAddr));

    // 创建存放输入流的缓冲
    byte[] buffer = new byte[4096];
    int num = -1; // 读入的字节数

    while ((num = re.read(buffer)) != -1) {
     ot.write(buffer, 0, num);
    }

   } catch (IOException e) {
    e.printStackTrace();
   } finally {
    try {
     re.close();
     ot.close();
    } catch (IOException e) {
     e.printStackTrace();
    }

   }

  //}

 }

 public static void main(String[] args) {
  new Thread(new DownLoadThread()).start();
 }

}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值