java上传文件通过ftp到服务器后,内容为空或者0kb
ftp上传的问题:记录下java前端上传file文件后,后端接收后再通过ftp上传到服务器上。前端使用的vue,element,前端实现没啥问题,主要问题在于后端上传文件到ftp服务器上时,文件内容为空或者0kb。主要关键点就在于下面这行代码://ftp端口的打开和关闭ftpClient.enterLocalPassiveMode();这行代码一定要在ftpClient.login(usernam
·
ftp上传的问题:
记录下java前端上传file文件后,后端接收后再通过ftp上传到服务器上。
前端使用的vue,element,前端实现没啥问题,主要问题在于后端上传文件到ftp服务器上时,文件内容为空或者0kb。主要关键点就在于下面这行代码:
//ftp端口的打开和关闭 ftpClient.enterLocalPassiveMode();
这行代码一定要在ftpClient.login(username, password);前面,这样才能生效
完整ftp工具类代码如下:
package com.jsc.transplant.utils; 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 org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; import org.apache.commons.net.ftp.FTPReply; public class FavFTPUtil { /** * 上传文件(可供Action/Controller层使用) * @param hostname FTP服务器地址 * @param port FTP服务器端口号 * @param username FTP登录帐号 * @param password FTP登录密码 * @param pathname FTP服务器保存目录 * @param fileName 上传到FTP服务器后的文件名称 * @param inputStream 输入文件流 * @return */ public static boolean uploadFile(String hostname, int port, String username, String password, String pathname, String fileName, InputStream inputStream){ boolean flag = false; FTPClient ftpClient = new FTPClient(); ftpClient.setControlEncoding("UTF-8"); try { //连接FTP服务器 ftpClient.connect(hostname, port); //ftp端口的打开和关闭 ftpClient.enterLocalPassiveMode(); //登录FTP服务器 ftpClient.login(username, password); //是否成功登录FTP服务器 int replyCode = ftpClient.getReplyCode(); if(!FTPReply.isPositiveCompletion(replyCode)){ return flag; } ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); ftpClient.makeDirectory(pathname); ftpClient.changeWorkingDirectory(pathname); ftpClient.storeFile(fileName, inputStream); inputStream.close(); ftpClient.logout(); flag = true; } catch (Exception e) { e.printStackTrace(); } finally{ if(ftpClient.isConnected()){ try { ftpClient.disconnect(); } catch (IOException e) { e.printStackTrace(); } } } return flag; } /** * 上传文件(可对文件进行重命名) * @param hostname FTP服务器地址 * @param port FTP服务器端口号 * @param username FTP登录帐号 * @param password FTP登录密码 * @param pathname FTP服务器保存目录 * @param filename 上传到FTP服务器后的文件名称 * @param originfilename 待上传文件的名称(绝对地址) * @return */ public static boolean uploadFileFromProduction(String hostname, int port, String username, String password, String pathname, String filename, String originfilename){ boolean flag = false; try { InputStream inputStream = new FileInputStream(new File(originfilename)); flag = uploadFile(hostname, port, username, password, pathname, filename, inputStream); } catch (Exception e) { e.printStackTrace(); } return flag; } /** * 上传文件(不可以进行文件的重命名操作) * @param hostname FTP服务器地址 * @param port FTP服务器端口号 * @param username FTP登录帐号 * @param password FTP登录密码 * @param pathname FTP服务器保存目录 * @param originfilename 待上传文件的名称(绝对地址) * @return */ public static boolean uploadFileFromProduction(String hostname, int port, String username, String password, String pathname, String originfilename){ boolean flag = false; try { String fileName = new File(originfilename).getName(); InputStream inputStream = new FileInputStream(new File(originfilename)); flag = uploadFile(hostname, port, username, password, pathname, fileName, inputStream); } catch (Exception e) { e.printStackTrace(); } return flag; } /** * 删除文件 * @param hostname FTP服务器地址 * @param port FTP服务器端口号 * @param username FTP登录帐号 * @param password FTP登录密码 * @param pathname FTP服务器保存目录 * @param filename 要删除的文件名称 * @return */ public static boolean deleteFile(String hostname, int port, String username, String password, String pathname, String filename){ boolean flag = false; FTPClient ftpClient = new FTPClient(); try { //连接FTP服务器 ftpClient.connect(hostname, port); //登录FTP服务器 ftpClient.login(username, password); //验证FTP服务器是否登录成功 int replyCode = ftpClient.getReplyCode(); if(!FTPReply.isPositiveCompletion(replyCode)){ return flag; } //切换FTP目录 ftpClient.changeWorkingDirectory(pathname); ftpClient.dele(filename); ftpClient.logout(); flag = true; } catch (Exception e) { e.printStackTrace(); } finally{ if(ftpClient.isConnected()){ try { ftpClient.logout(); } catch (IOException e) { } } } return flag; } /** * 下载文件 * @param hostname FTP服务器地址 * @param port FTP服务器端口号 * @param username FTP登录帐号 * @param password FTP登录密码 * @param pathname FTP服务器文件目录 * @param filename 文件名称 * @param localpath 下载后的文件路径 * @return */ public static boolean downloadFile(String hostname, int port, String username, String password, String pathname, String filename, String localpath){ boolean flag = false; FTPClient ftpClient = new FTPClient(); try { //连接FTP服务器 ftpClient.connect(hostname, port); //登录FTP服务器 ftpClient.login(username, password); //验证FTP服务器是否登录成功 int replyCode = ftpClient.getReplyCode(); if(!FTPReply.isPositiveCompletion(replyCode)){ return flag; } //切换FTP目录 ftpClient.changeWorkingDirectory(pathname); FTPFile[] ftpFiles = ftpClient.listFiles(); for(FTPFile file : ftpFiles){ if(filename.equalsIgnoreCase(file.getName())){ File localFile = new File(localpath + "/" + file.getName()); OutputStream os = new FileOutputStream(localFile); ftpClient.retrieveFile(file.getName(), os); os.close(); } } ftpClient.logout(); flag = true; } catch (Exception e) { e.printStackTrace(); } finally{ if(ftpClient.isConnected()){ try { ftpClient.logout(); } catch (IOException e) { } } } return flag; } }
后端代码:
@RequestMapping("/jdFtp/submitFtp") @ApiOperation(value = "警灯配置页提交", notes = "警灯配置页提交", httpMethod = "POST") public ApiResult<Map<String, Object>> submitFtp(@RequestParam("type") String type, @RequestParam String fileName,@RequestParam("file") MultipartFile file) throws IOException { File f = transferToFile(file); QueryWrapper<JdFtpUpload> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("jd_ftp_type", type); queryWrapper.isNotNull("jd_ftp_type"); List<JdFtpUpload> list = jingDengFtpService.list(queryWrapper); if(list.size()>0){ for (int i = 0; i <list.size() ; i++) { if(fileName.equals(list.get(i).getJdFtpName())){ FileInputStream in =new FileInputStream(f); FavFTPUtil.uploadFile(ip,port,user, password,list.get(i).getJdFtpPath(),list.get(i).getJdFtpName(),in); }else { return new ApiResult<>(-1, "该文件名不存在与对应类型的表格内,请仔细核对"); } } }else { return new ApiResult<>(-1, "该文件类型不存在数据,请联系研发人员添加"); } return new ApiResult<>(0, "提交成功"); } private File transferToFile(MultipartFile multipartFile) throws IOException { // 选择用缓冲区来实现这个转换即使用java 创建的临时文件 使用 MultipartFile.transferto()方法 。 File toFile = null; if (multipartFile.equals("") || multipartFile.getSize() <= 0) { multipartFile = null; } else { InputStream ins = null; ins = multipartFile.getInputStream(); toFile = new File(multipartFile.getOriginalFilename()); inputStreamToFile(ins, toFile); ins.close(); } return toFile; } //获取流文件 private static void inputStreamToFile(InputStream ins, File file) { try { OutputStream os = new FileOutputStream(file); int bytesRead = 0; byte[] buffer = new byte[8192]; while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) { os.write(buffer, 0, bytesRead); } os.close(); ins.close(); } catch (Exception e) { e.printStackTrace(); } }
其实MultipartFile不转为File应该也可以的。
更多推荐
已为社区贡献1条内容
所有评论(0)