文件上传

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;
}

posted @ 2020-12-23 21:38  WikH❤  阅读(172)  评论(0)    收藏  举报