文件上传

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;
}
原文地址:https://www.cnblogs.com/kutoutuo/p/14181524.html