`
tangkuo
  • 浏览: 101730 次
  • 性别: 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后台管理系统后台代码.rar

    Java后台管理系统后台代码是一个用于构建企业级Web应用的框架或示例项目,它通常包含了诸如用户管理、权限控制、数据操作、业务逻辑等核心功能。这个压缩包中的内容可能涵盖了一个完整的Java后端项目的各个组成部分...

    java 文件上传服务器,前后台代码

    总的来说,"java 文件上传服务器,前后台代码"项目涉及了Java Web开发的核心技术,包括SpringMVC的请求处理、文件操作、异常处理、MyBatis的数据库操作以及前端与后端的交互,这些都是开发人员必备的技能。...

    Java 版通讯录 后台代码

    通过分析和实践这个【Java版通讯录后台代码】项目,学习者可以巩固对Java基础知识的理解,包括类与对象、文件操作、数据库交互、控制台输入/输出以及设计模式的应用。同时,这也是迈向更复杂系统开发的第一步,如...

    java社交项目后台代码.zip

    综上所述,这个Java社交项目后台代码涵盖了Java Web开发的多个重要方面,包括后端架构设计、数据库操作、文件处理、用户交互以及系统测试等。对于学习和理解SSM框架以及社交应用的后端开发流程有着极大的帮助。通过...

    DSOframer+接口文档+java后台及前台代码说明

    然后,通过分析Java后台代码,理解文件处理和服务端逻辑;最后,编写前端代码并与后端交互,进行实际的页面集成和功能测试。 通过上述内容,我们可以了解到DSOframer是一个强大的文档预览解决方案,涉及前端...

    一个后台代码,供大家参考

    6. **错误处理和日志记录**:为了确保系统的稳定性和可追踪性,后台代码会包含异常处理机制和日志记录。错误信息应清晰,便于排查问题。 7. **安全措施**:后台代码需要考虑的安全问题包括防止SQL注入、XSS攻击、...

    微信支付java后台代码

    这个"微信支付java后台代码"项目,根据标题和描述,提供了一套完整的、经过测试可用的解决方案,适用于Java开发者集成到自己的应用程序中。下面将详细介绍相关的知识点。 **1. 微信支付API** 微信支付提供了丰富的...

    javaOA后台部分代码

    JavaOA后台部分代码是OA(Office Automation)项目中的核心组成部分,主要负责处理业务逻辑、数据交互和系统控制等任务。这个代码库包含了实现各种OA系统功能的JAVA代码,为开发者提供了一个良好的学习和参考资源。...

    前台从java后台获取excel表格并下载

    首先,标题"前台从java后台获取excel表格并下载"表明我们需要实现一个功能,即前端用户请求时,由Java后台生成Excel文件,然后提供下载链接或直接触发下载。这个过程涉及到的主要技术栈是Eclipse、Maven、Spring MVC...

    java后台精美模板(一共25个)

    在Java Web开发中,后台模板通常指的是用于处理业务逻辑、数据操作以及与前端交互的代码框架。它们可以帮助开发者快速搭建功能模块,减少重复编码的工作量,使开发过程更加高效。这些模板通常基于MVC(Model-View-...

    班级信息管理系统后台java代码

    Java后台代码通常涉及到Spring框架、MyBatis等技术,Spring用于管理应用程序的组件和依赖关系,提供AOP(面向切面编程)和IOC(控制反转)等功能,是企业级应用开发的首选。MyBatis则是一个轻量级的持久层框架,它...

    基于java开发的后台管理系统

    在学习过程中,你可以通过分析“cards.7z”这个压缩文件中的代码,了解如何在SSM框架下设计和实现数据库操作、业务逻辑处理以及视图渲染。此外,"erp.sql"文件很可能是数据库脚本,用于初始化或更新系统的数据库结构...

    java 企业官网源代码 SSM框架开发带后台.zip

    开发者可以在JSP中混合Java代码和HTML,方便进行页面逻辑处理。 **6. 后台管理系统** 项目包含一个后台管理系统,允许管理员进行内容管理、用户管理、权限控制等操作。后台通常包括登录验证、角色管理、菜单设置、...

    java实现模板下载功能

    - **下载处理逻辑**:在`downLoadBillFormat`方法中,首先对文件名进行URL编码,然后设置HTTP响应头`Content-Disposition`为`attachment`,表明该响应内容应被客户端作为附件下载。 4. **XML配置**: ```xml ...

    android文件的上传和下载+后台完整代码

    本资源提供了一个完整的解决方案,涵盖了从Android客户端到后台服务器的整个流程,包括头像的上传与裁剪、文件上传、文件在线预览以及下载。以下是关于这些功能的详细知识点: 1. **头像上传与裁剪**: - 使用`...

    java多线程加队列上传文件_后台处理

    ### Java多线程加队列上传文件_后台处理 #### 概述 本文将详细介绍一个基于Java实现的多线程文件上传系统,并结合队列管理技术来优化后台处理流程。该系统通过创建多个线程来并行处理客户端的文件上传请求,同时...

    基于Java的后台管理系统快速开发脚手架.zip

    在后台管理系统中,Java常用于实现业务逻辑、数据处理和系统接口。 二、MVC架构模式 基于Java的后台管理系统通常采用Model-View-Controller(MVC)架构模式。Model负责数据模型,View负责用户界面展示,Controller...

    前端签到与后台逻辑代码实现

    在本文中,我们将深入探讨"前端签到与后台逻辑代码实现"这一主题,结合使用SpringBoot、Java、MySQL和Maven的技术栈。签到功能是许多应用程序中的常见特性,它允许用户确认他们的在线状态或者参与特定活动。我们将...

    Android 社交App+java web后台整套源代码

    在本资源中,我们拥有一套完整的Android社交应用与Java Web后台系统的源代码,这为开发者提供了一个绝佳的学习和实践平台。这套源代码是基于Android Studio和MyEclipse开发的,涵盖了客户端应用和服务器端服务的全部...

    JAVA FTP下载 程序——源代码

    - 在后台 Java 代码中处理用户提交的数据,并调用前面提到的 FTP 客户端类进行文件的下载。 - 可以使用 Struts 的 `Action` 接口来实现具体的业务逻辑。 ### 4. 常见问题及解决方案 #### 登录失败 - 如果出现登录...

Global site tag (gtag.js) - Google Analytics