• 文件上传


    1、上传到disk

    步骤:

    //1、创建DiskFileItemFactory对象,设置缓冲区大小和临时文件目录。
    new DiskFileItemFactory;
    //2、使用DiskFileItemFactory 对象创建ServletFileUpload对象,并设置上传文件的大小限制。
    new ServletFileUpload(diskFileItemFactory);
    //3、调用ServletFileUpload.parseRequest方法解析request对象,得到一个保存了所有上传内容的List对象。
    servletFileUpload.parseRequest(request);
    //4、对list进行迭代,每迭代一个FileItem对象,调用其isFormField方法判断是否是上传文件:
    for(FileItem fileItem : item){
       if(fileItem.isFormFiled()){
           
       } 
    //4.1为普通表单字段,则调用getFieldName、getString方法得到字段名和字段值。
    	   String name = fileItem.getFieldName();
           String value = fileItem.getString("UTF-8");
           System.out.println(name+":"+value);
    //4.2.为上传文件,则调用getInputStream方法得到数据输入流,从而读取上传数据
    	   String fileName = fileItem.getName();
           long size = fileItem.getSize();
           System.out.println(fileName+":"+size+"Byte");
           InputStream inputStream = fileItem.getInputStream();
           String path =req.getServletContext().getRealPath("file/"+fileName);
           OutputStream outputStream = new FileOutputStream(path);
           int temp = 0;
           while((temp = inputStream.read())!=-1){
           outputStream.write(temp);	
    

    注意:

    1、input 的 type 设置为 file,因为是针对文件的
    2、form 表单的 method 设置 post,因为get 请求会将⽂件名传给服务端,⽽不是⽂件本身

    jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
    <title>Title</title>
    </head>
    <body>
    <form enctype="multipart/form-data" action="/upload" method="post">
    <input name="desc" type="text"/><br/>
    <input name="text" type="file"/><br/>
    <input type="submit" value="上传"/>
    </form>
    </body>
    </html>
    

    文件上传

    @WebServlet("/upload")
    public class UploadServlet extends HttpServlet {
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, IOException {
    }
    
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, IOException {
    
       try {
         DiskFileItemFactory fileItemFactory = new DiskFileItemFactory();
         ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);
         List<FileItem> list = servletFileUpload.parseRequest(req);
         
       for(FileItem fileItem : list){
         if(fileItem.isFormField()){
           String name = fileItem.getFieldName();
           String value = fileItem.getString("UTF-8");
           System.out.println(name+":"+value);
       }else{
           String fileName = fileItem.getName();
           long size = fileItem.getSize();
           System.out.println(fileName+":"+size+"Byte");
           InputStream inputStream = fileItem.getInputStream();
           String path =req.getServletContext().getRealPath("file/"+fileName);
           OutputStream outputStream = new FileOutputStream(path);
           int temp = 0;
           while((temp = inputStream.read())!=-1){
            outputStream.write(temp);
          }
           outputStream.close();
           inputStream.close();
           System.out.println("上传成功");
        }
      }
    } catch (FileUploadException e) {
        e.printStackTrace();
       }
      }
    }
    

    文件下载

    @WebServlet("/download")
    public class DownloadServlet extends HttpServlet {
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, IOException {
         String type = req.getParameter("type");
         String fileName = "";
         switch (type){
           case "png":
              fileName = "1.png";
              break;
          case "txt":
              fileName = "test.txt";
              break;
    }
         resp.setContentType("application/x-msdownload");
         resp.setHeader("Content-Disposition","attachment;filename="+fileName);
         OutputStream outputStream = resp.getOutputStream();
         String path = req.getServletContext().getRealPath("file/"+fileName);
         InputStream inputStream = new FileInputStream(path);
         int temp = 0;
         while((temp=inputStream.read())!=-1){
    		outputStream.write(temp);
         }
         inputStream.close();
         outputStream.close();
      }
    }
    

    2、上传到ftp

    private static boolean uploadFile2(String originFileName, InputStream input) {
        System.out.println(FTP_ADDRESS);
        boolean success = false;
        FTPClient ftpClient = new FTPClient();
        try {
            login(ftpClient);
            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
            ftpClient.enterLocalPassiveMode(); //用被动模式传输
            ftpClient.setDataTimeout(30000); //设置超时时间
            ftpClient.setBufferSize(1024 * 1024); //设置默认超时时间
            ftpClient.makeDirectory(FTP_BASEPATH);
            ftpClient.changeWorkingDirectory(FTP_BASEPATH);
            success = ftpClient.storeFile(originFileName, input);
    
            input.close();
            Boolean close = closeConnect(ftpClient);
    
        } catch (IOException e) {
            log.error(e.getMessage(), e);
            e.printStackTrace();
        } finally {
            Boolean close = closeConnect(ftpClient);
            System.out.println("连接是否关闭:" + close);
        }
        return success;
    }
    public static Boolean uploadFile2(String fileName, InputStream inputStream, String ftpAddress, int ftpPort,
                                     String ftpUserName, String ftpPassWord, String uploadPaasPath) {
        FTP_ADDRESS = ftpAddress;
        FTP_PORT = ftpPort;
        FTP_USERNAME = ftpUserName;
        FTP_PASSWORD = ftpPassWord;
        FTP_BASEPATH = uploadPaasPath;
        uploadFile2(fileName,inputStream);
    
        return true;
    }
    
    
    public static InputStream downloadFileV2(String fileName, String attachmentPath) {
        System.out.println(FTP_ADDRESS);
        InputStream input = null;
        InputStream resultOrginalStream = null;
    
        FTPClient ftpClient = new FTPClient();
        try {
            boolean flag = login(ftpClient);
            log.info("ftp登录" + flag);
            log.info("***附件路径" + attachmentPath);
            attachmentPath = attachmentPath.substring(0, attachmentPath.lastIndexOf("/"));
            log.info("***附件路径" + attachmentPath);
            ftpClient.changeWorkingDirectory("/home/paas_ftp" + attachmentPath);
    
        } catch (IOException e1) {
            try {
                ftpClient.changeWorkingDirectory(FTP_BASEPATH);
            } catch (IOException e2) {
                e2.printStackTrace();
            }
        }
    
        String remoteAbsoluteFile;
        try {
            remoteAbsoluteFile = toFtpFilename(fileName);
    
            // 下载文件
            ftpClient.setBufferSize(1024);
            ftpClient.setControlEncoding("UTF-8");
            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
            ftpClient.setDataTimeout(60000);
            ftpClient.setRemoteVerificationEnabled(false);
            ftpClient.enterLocalPassiveMode();
    
            // 设置传输类型为二进制;
            ftpClient.setFileTransferMode(FTPClient.BINARY_FILE_TYPE);
            input = ftpClient.retrieveFileStream(remoteAbsoluteFile);
            resultOrginalStream = input;
    
            input.close();
            ftpClient.logout();
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(120000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    Boolean close = closeConnect(ftpClient);
                    System.out.println("连接是否关闭:" + close);
                }
            }).start();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return resultOrginalStream;
    }
  • 相关阅读:
    再谈反射
    XmlElement和XmlNode的区别
    几个常用的集合类的使用
    node.js 练习3 调用函数
    ioc 的好文章 转自 GavinJun
    sqlserver 使用小技巧总结
    node.js 练习2 (调用函数)
    c# 面向对象基础
    linq 和 lmabda 表达式 的用法 和优劣 转自 农码一生
    memcache 基本操作
  • 原文地址:https://www.cnblogs.com/kutoutuo/p/14181524.html
Copyright © 2020-2023  润新知