`
tangkuo
  • 浏览: 94892 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

Java下载文件后台代码 处理逻辑

 
阅读更多
文件下载功能是web开发中经常使用到的功能,使用HttpServletResponse对象就可以实现文件的下载

文件下载功能的实现思路:找到文件路径,取文件名,设置浏览器响应头,获取输入流,获取输出流,将输入流通过buffer转到输出流输出到浏览器

  1.获取要下载的文件的绝对路径

  2.获取要下载的文件名

  3.设置content-disposition响应头控制浏览器以下载的形式打开文件

  4.获取要下载的文件输入流FileInputStream

  5.创建数据缓冲区buffer

  6.通过response对象获取OutputStream流

  7.将FileInputStream流写入到buffer缓冲区

  8.使用OutputStream将缓冲区的数据输出到客户端浏览器

文件下载注意事项:编写文件下载功能时推荐使用OutputStream流,避免使用PrintWriter流,因为OutputStream流是字节流,可以处理任意类型的数据,而PrintWriter流是字符流,只能处理字符数据,如果用字符流处理字节数据,会导致数据丢失。



[java] view plain copy

    package gacl.response.study; 
    import java.io.FileInputStream; 
    import java.io.FileNotFoundException; 
    import java.io.FileReader; 
    import java.io.IOException; 
    import java.io.InputStream; 
    import java.io.OutputStream; 
    import java.io.PrintWriter; 
    import java.net.URLEncoder; 
    import javax.servlet.ServletException; 
    import javax.servlet.http.HttpServlet; 
    import javax.servlet.http.HttpServletRequest; 
    import javax.servlet.http.HttpServletResponse; 
    /**
     * @author gacl
     * 文件下载
     */ 
    public class ResponseDemo02 extends HttpServlet { 
     
        public void doGet(HttpServletRequest request, HttpServletResponse response) 
                throws ServletException, IOException { 
            downloadChineseFileByOutputStream(response);//下载中文文件 
        } 
     
        /**
         * 下载中文文件,中文文件下载时,文件名要经过URL编码,否则会出现文件名乱码
         * @param response
         * @throws FileNotFoundException
         * @throws IOException
         */ 
        private void downloadChineseFileByOutputStream(HttpServletResponse response) 
                throws FileNotFoundException, IOException { 
            String realPath = this.getServletContext().getRealPath("/download/张家界国家森林公园.JPG");//获取要下载的文件的绝对路径 
            String fileName = realPath.substring(realPath.lastIndexOf("\\")+1);//获取要下载的文件名 
            //设置content-disposition响应头控制浏览器以下载的形式打开文件,中文文件名要使用URLEncoder.encode方法进行编码,否则会出现文件名乱码 
            response.setHeader("content-disposition", "attachment;filename="+URLEncoder.encode(fileName, "UTF-8")); 
            InputStream in = new FileInputStream(realPath);//获取文件输入流 
            int len = 0; 
            byte[] buffer = new byte[1024]; 
            OutputStream out = response.getOutputStream(); 
            while ((len = in.read(buffer)) > 0) { 
                out.write(buffer,0,len);//将缓冲区的数据输出到客户端浏览器 
            } 
            in.close(); 
        } 
         
        public void doPost(HttpServletRequest request, HttpServletResponse response) 
                throws ServletException, IOException { 
            doGet(request, response); 
        } 
    } 







----------java实现ftp的文件上传和下载 --------------
    import static org.junit.Assert.fail; 
     
    import java.io.File; 
    import java.io.FileInputStream; 
    import java.io.FileOutputStream; 
    import java.io.IOException; 
     
    import org.apache.commons.io.IOUtils; 
    import org.apache.commons.net.ftp.FTPClient; 
    import org.apache.commons.net.ftp.FTPFile; 
    import org.junit.AfterClass; 
    import org.junit.BeforeClass; 
    import org.junit.Test; 
     
    /**
     *
     * @version 创建时间:2015年12月14日 上午9:45:32
     * 
     */ 
    public class JunitFtp { 
     
      private static FTPClient ftpClient; 
      private static String ftpIp = "192.168.0.229"; 
      private static String ftpUser = "ff"; 
      private static String ftpPassWord = "ff"; 
      private static String ftpPort = "21"; 
      private static String workingDirectory = "\\data"; 
      private static String localDirectory = "E:\\home\\ftp\\download"; 
     
      @BeforeClass 
      public static void setUpBeforeClass() throws Exception { 
        // ftp连接 
        ftpClient = new FTPClient(); 
        ftpClient.setControlEncoding("gb2312"); 
        ftpClient.connect(ftpIp, Integer.parseInt(ftpPort)); 
        ftpClient.login(ftpUser, ftpPassWord); 
      } 
     
      @AfterClass 
      public static void tearDownAfterClass() throws Exception { 
     
        ftpClient.disconnect(); 
      } 
     
      /**
       *单个文件下载
       * @throws IOException
       * "JiaYanFei"
       * 2015年12月14日
       */ 
      @Test 
      public void fileDownload() throws IOException { 
        // ftpClient.setControlEncoding("gb2312"); 
        FileOutputStream fos = null; 
        try { 
          ftpClient.connect(ftpIp, Integer.parseInt(ftpPort)); 
          ftpClient.login(ftpUser, ftpPassWord); 
          ftpClient.changeWorkingDirectory(workingDirectory); 
          System.out.println("dir:" + ftpClient.printWorkingDirectory()); 
          FTPFile[] files = ftpClient.listFiles(); 
            // FTP服务器文件路径 
            String remoteFileName = "\\data\\中.txt";// 已经切换到data目录只写 中.txt 也可以 但是 写\\中.txt不行 
            String newFileName = "文.txt"; 
            // 文件下载存放路径 
            fos = new FileOutputStream(localDirectory + File.separator+ newFileName); 
            fos.flush(); 
            ftpClient.setBufferSize(1024); 
            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); 
            if (ftpClient.retrieveFile(remoteFileName, fos)) { 
              System.out.println(" 文件下载成功。。"); 
            } else { 
              System.out.println(" 文件下载失败。。"); 
              fail("下载失败"); 
            } 
     
        } catch (Exception e) { 
          e.printStackTrace(); 
        } finally { 
          IOUtils.closeQuietly(fos); 
          ftpClient.disconnect(); 
        } 
     
      } 
     
      @Test 
      public void fileUpload() throws IOException { 
        FileInputStream fis = null; 
        try { 
          ftpClient.connect(ftpIp, Integer.parseInt(ftpPort)); 
          ftpClient.login(ftpUser, ftpPassWord); 
          ftpClient.changeWorkingDirectory("/data"); 
     
          fis = new FileInputStream(new File("E:\\home\\ftp\\data\\o.txt")); 
          if (ftpClient.storeFile("/data/backFile3.txt", fis)) {//  /backFile3.txt backFile3.txt也可以 
            System.out.println("上传成功!"); 
          } else { 
            System.out.println("上传失败"); 
            fail("上传失败"); 
          } 
        } finally { 
          IOUtils.closeQuietly(fis); 
          ftpClient.disconnect(); 
        } 
     
      } 
     
      
      
       
       
      /**
       *目录下载
       * @throws IOException
       * 2015年12月14日
       */ 
      @Test 
      public void downloadDirectory() throws IOException { 
        downloadDirectory("\\data" ,localDirectory+ "\\data"); 
      } 
     
     
      /**
       *目录递归下载
       * @param basePath
       * @param localPath
       * @throws IOException
       * 2015年12月14日
       */ 
      public void downloadDirectory(String basePath, String localPath) throws IOException{ 
        ftpClient.changeWorkingDirectory(basePath); 
        System.out.println(ftpClient.printWorkingDirectory()); 
        FTPFile[] files = ftpClient.listFiles(); 
        if (0 == files.length) {// 目录为空 创建空目录 
          System.out.println("dir name: " +localPath ); 
          new File(localPath ).mkdirs(); 
          return; 
        } 
        File file = null; 
        for(FTPFile f:files){ 
          if(f.isDirectory()){ 
            downloadDirectory(basePath + File.separator + f.getName(), localPath + File.separator + f.getName()); 
          }else{ 
            file = new File(localPath);//先判断本地目录是否存在     --不存在则创建 
            if(!file.exists()){ 
              file.mkdirs(); 
            } 
            FileOutputStream fos = new FileOutputStream( localPath + File.separator + f.getName()); 
            fos.flush(); 
            ftpClient.setBufferSize(1024); 
            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); 
            System.out.println("fileName: " + f.getName()); 
            if (ftpClient.retrieveFile(basePath + File.separator +f.getName(), fos)) { 
              System.out.println(" 文件下载成功。。"); 
            } else { 
              System.out.println(" 文件下载失败。。"); 
              fail("下载失败"); 
            } 
          } 
           
        } 
         
      } 
       
    } 





------------------------------------java socket实现文件的上传和下载-------------
import Java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerScoket {
//服务器端
int port= 8822;//设置的端口号
public void UpFile(){//接受客户端上传的文件,并保存
try { 
ServerSocket server= new ServerSocket(port);
           while(true){ 
            Socket socket = server.accept(); 
               DataInputStream is = new  DataInputStream(socket.getInputStream());  
               OutputStream os = socket.getOutputStream();                 
               //1、得到文件名      
               String filename="E:\\";
               filename += is.readUTF();
            
               System.out.println("新生成的文件名为:"+filename); 
               FileOutputStream fos = new FileOutputStream(filename); 
               byte[] b = new byte[1024];
               int length = 0; 
               while((length=is.read(b))!=-1){ 
                   //2、把socket输入流写到文件输出流中去 
                   fos.write(b, 0, length); 
               } 
               fos.flush(); 
               fos.close();              
               is.close(); 
               socket.close(); 
           }              
       } catch (IOException e) { 
           // TODO Auto-generated catch block 
           e.printStackTrace(); 
       }   

}


public void DownFile(String filePath){
//接受客户端的下载请求,将本地文件传输给客户端
       try {
           while (true) {
ServerSocket server= new ServerSocket(port);
            // 选择进行传输的文件
               File fi = new File(filePath);
               System.out.println("文件长度:" + (int) fi.length());
               // public Socket accept() throws
               // IOException侦听并接受到此套接字的连接。此方法在进行连接之前一直阻塞。
               Socket socket = server.accept();
               System.out.println("建立socket链接");
              /* DataInputStream dis = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
               dis.readByte();
               */
               DataInputStream fis = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath)));
               DataOutputStream ps = new DataOutputStream(socket.getOutputStream());
               //将文件名及长度传给客户端。这里要真正适用所有平台,例如中文名的处理,还需要加工,具体可以参见Think In Java 4th里有现成的代码。
               ps.writeUTF(fi.getName());
               System.out.println(fi.getName());
               ps.flush();
              int bufferSize = 8192;
               byte[] buf = new byte[bufferSize];
               while (true) {
                   int read = 0;
                   if (fis != null) {
                       read = fis.read(buf);
                   }
                   if (read == -1) {
                       break;
                   }
                   ps.write(buf, 0, read);
               }
               ps.flush();
               // 注意关闭socket链接哦,不然客户端会等待server的数据过来,
               // 直到socket超时,导致数据不完整。               
               fis.close();
               socket.close();               
               System.out.println("文件传输完成");
           }
       } catch (Exception e) {
           e.printStackTrace();
       }
}
public static void main(String arg[]) {
    //String filepath="D:\\test.txt";
       new ServerScoket().UpFile();
   }

}

********************************************************************************************************************************************************

import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.NET.Socket;

public class ClientScoket {
//客户端
private String ip = "localhost";// 设置成服务器IP
    private int port = 8822;//设置端口号
    public void UpFile(String filePath){
    //上传文件,将本地文件传输到服务器端
        try {
        Socket socket = new Socket(ip,port);
            while (true) {
             // 选择进行传输的文件
                File fi = new File(filePath);
                System.out.println("文件长度:" + (int) fi.length());
               /* DataInputStream dis = new DataInputStream(new BufferedInputStream(s.getInputStream()));
                dis.readByte();
                */
                DataInputStream fis = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath)));
                DataOutputStream ps = new DataOutputStream(socket.getOutputStream());
                //将文件名及长度传给客户端。这里要真正适用所有平台,例如中文名的处理,还需要加工,具体可以参见Think In Java 4th里有现成的代码。
                ps.writeUTF(fi.getName());
                ps.flush();
           
                int bufferSize = 8192;
                byte[] buf = new byte[bufferSize];
                while (true) {
                    int read = 0;
                    if (fis != null) {
                        read = fis.read(buf);
                    }

                    if (read == -1) {
                        break;
                    }
                    ps.write(buf, 0, read);
                }
                ps.flush();
                // 注意关闭socket链接哦,不然客户端会等待server的数据过来,
                // 直到socket超时,导致数据不完整。               
                fis.close();
                socket.close();               
                System.out.println("文件传输完成");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } 
}
   
public void DownFile(){
//从服务器端下载文件
try {
    Socket socket = new Socket(ip,port);
           while(true){ 
               DataInputStream is = new  DataInputStream(socket.getInputStream());  
               OutputStream os = socket.getOutputStream();                 
               //1、得到文件名      
               String filename="E:\\";
               filename += is.readUTF();
            
               System.out.println("新生成的文件名为:"+filename); 
               FileOutputStream fos = new FileOutputStream(filename); 
               byte[] b = new byte[1024];
               int length = 0; 
               while((length=is.read(b))!=-1){ 
                   //2、把socket输入流写到文件输出流中去 
                   fos.write(b, 0, length); 
               } 
               fos.flush(); 
               fos.close();              
               is.close(); 
               socket.close(); 
           } 
            
       } catch (IOException e) { 
           // TODO Auto-generated catch block 
           e.printStackTrace(); 
       }  

public static void main(String arg[]) {
String filepath="D:\\test.txt";
       new ClientScoket().UpFile(filepath);;
   }
}
分享到:
评论

相关推荐

    分布式Java游戏服务器,包括集群管理服务器、网关服务器、大厅服务器、游戏逻辑服务器_java_代码_下载

    一个基于棋牌、MMORPG游戏的分布式java游戏服务器,理论上可以无限水平扩展网关服,大厅服、游戏服达到人数承载。实现了集群注册中心,网关、登陆、后台服务器监控等通用服务器;封装了redis集群、mongodb等数据库...

    Java开发技术大全(500个源代码).

    HelloNative.java 准备调用C函数的java文件 HelloNative.lib 用VC编译生成的静态库文件 HelloNative.obj 用VB编译生成的目标文件 HelloNativeTest.java 测试本地化是否成功的类文件 instanceVar.java 定义一个...

    Java通用后台管理系统源码 JAVATYHTXT.rar

    Java通用后台管理系统源码 源码描述: 一、特色功能 1、采用Spring MVC的静态加载缓存功能,在首页将Javascript文件、CSS文件和图片等静态资源文件加载进来放进内存,极大提高ExtJS的加载速度。 2、三种皮肤主题:...

    java实现通用后台管理系统

    1、可以解决JAVA项目90%的重复性工作,可完全实现二次开发、满足90%项目需求,让开发更多关注业务逻辑。既能快速提高开发效率,帮助集团节省人力成本, 2、支持模块化设计,层次结构清晰。内置一系列企业信息管理...

    最新JAVA通用后台管理系统(ExtJS+Hibernate+Spring MVC )

    该系统可作为OA、网站、电子政务...3、分别封装了模型层、控制层、业务逻辑层和数据持久层的通用操作模块,层次分明,大大减少代码冗余,二次开发效率高。 4、系统是公司多个项目的基础框架,稳定性好,支持大并发。

    基于Vue的电影在线预订与管理系统-后台java代码(ssm)(毕业设计).zip

    源代码:包括Java代码、配置文件和数据库脚本。这些代码展示了如何使用SSM框架进行业务逻辑处理、数据持久化和Web交互。 项目文件:除了代码,我还分享了整个项目的文件,包括设计稿、图标、图片等资源。这些资源...

    java+mysql实现的代码分享网(所有源码已开源,效果可看网址:www.admintwo.com)

    所有的业务逻辑处理,均放在serviceimpl包下。调用规则均是:action--调用service接口--调用dao接口 5、由于使用了layui前端框架,为了保证代码清晰,每个html文件,均对应一个js文件处理,并且js文件名也和jsp...

    Java实现的在线商城后台,可用作毕业设计,课程设计

    代码结构清晰,逻辑严谨,是学习Java编程和项目实践的优秀材料。 毕业论文——包含了一篇探讨在线商城后台项目背景、技术原理和实现过程的学术论文,可作为论文撰写参考。通过阅读论文,学习者可以了解项目的理论...

    java范例开发大全源代码

     实例147 随机读写Java类文件 221  第3篇 Java面向对象编程  第8章 面向对象(教学视频:72分钟) 226  8.1 类 226  实例148 简单的通讯录类 226  实例149 简单的长度单位转换类 227  实例150 ...

    开源的Java开发脚手架springboot,cloud,还有基于vue的后台权限管理系统做一套开源的后台+源代码+文档说明

    ## 项目介绍 提供快速的搭建spring,spring boot项目,提供spring boot阔展等,希望通过大家一起学习人人都可以堆各种组件当架构尸吓尿...下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

    毕业设计基于Cesium时空数据可视化后台Java SSM框架.zip

    源代码:包括Java代码、配置文件和数据库脚本。这些代码展示了如何使用SSM框架进行业务逻辑处理、数据持久化和Web交互。 项目文件:除了代码,我还分享了整个项目的文件,包括设计稿、图标、图片等资源。这些资源...

    从Java走向Java+EE+.rar

    第1章 Java EE的基本知识 1 1.1 Java EE的出现及其特点 1 1.2 Java EE的分层模型和平台组成 4 1.2.1 Java EE的分层模型 4 1.2.2 Java EE的结构变形 5 1.2.3 Java EE平台的组成 7 1.3 Java EE参与人员的...

    基于Java的在线购物系统的设计与实现(源代码+系统+文档).zip

    采用三层构架以后,用户界面层通过统一的接口向业务层发送请求,业务层按自己的逻辑规则将请求处理之后进行数据库操作,然后将数据库返回的数据封装成类的形式返回给用户界面层。这样用户界面层甚至可以不知道数据库...

    ExtJS+JAVA通用后台权限管理源码

    系统可作为OA、网站、电子政务、...3、分别封装了模型层、控制层、业务逻辑层和数据持久层的通用操作模块,层次分明,大大减少代码冗余,二次开发效率高。 4、系统是公司多个项目的基础框架,稳定性好,支持大并发。

    最新JAVA通用后台管理系统(ExtJS 4.2+Hibernate 4.1.7+Spring MVC 3.2.8)MyEclipse版本

    3、分别封装了模型层、控制层、业务逻辑层和数据持久层的通用操作模块,层次分明,大大减少代码冗余,二次开发效率高。 4、系统是公司多个项目的基础框架,稳定性好,支持大并发。 二、主要功能 1、采用ExtJS 4.2...

    疯狂JAVA讲义

    学生提问:当我们使用编译C程序时,不仅需要指定存放目标文件的位置,也需要指定目标文件的文件名,这里使用javac编译Java程序时怎么不需要指定目标文件的文件名呢? 13 1.5.3 运行Java程序 14 1.5.4 根据...

    JAVA项目开发全程实录(含电子书和所有源代码)

    《Java项目开发全程实录》这一本书从开发背景、需求分析、系统功能分析、数据库分析、数据库建模、网站开发和网站发布或者程序打包与运行,每一过程都进行了详细的介绍。 目 录 第1章 进销存管理系统(Swing+SQL ...

    JavaSpring的商城项目前台+后台+api

    通过配置文件或注解,对象的创建和绑定由Spring容器管理,而不是由应用程序代码直接控制。 面向切面编程(AOP):Spring支持AOP,允许定义方法拦截器和切点来分离应用程序的业务逻辑和系统服务。这有助于增加模块化...

    毕业设计JAVA+SQL电子通讯录带系统托盘(论文+源代码)

    源代码和数据库设计:提供全面的源代码和数据库设计文件,使学生能够详细了解应用的开发过程,包括前端界面设计和后端逻辑处理。 系统托盘功能:特别设计系统托盘功能,使应用能够在后台运行,便于用户随时访问和...

    个人博客项目源码(java)

    本项目根据企业项目的逻辑制作的个人blog,分为前后台系统,结合最新springboot、mybatis、yml配置文件、文件上传等技术点完成,可以学习该项目的技术点,若下载后不可用,请留言,并给我邮箱,重发一份给你,若想...

Global site tag (gtag.js) - Google Analytics