对于JAVA实现SFTP实例 SpringBoot实现SSH-2.0-OpenSSH

    xiaoxiao2022-07-13  189

    使用Sftp实例连接虚拟机进行图片上传与下载

    本博客是使用sftp进行连接虚拟机进行图片上传和下载的实例 如果使用ftp进行连接虚拟机可能会出现SSH-2.0-OpenSSH_5.3等错误 这是因为它不支持ftp连接,而使用sftp则不会,网上最流行的用的最多的sftp连接是使用jsch技术 话不多说,直接上代码

    项目依赖

    <!--文件上传等相关jar包--> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency> <dependency> <groupId>commons-net</groupId> <artifactId>commons-net</artifactId> <version>3.3</version> </dependency> <dependency> <groupId>com.jcraft</groupId> <artifactId>jsch</artifactId> <version>0.1.49</version> </dependency> <!--jsch所依赖的jar包--> <dependency> <groupId>com.jcraft</groupId> <artifactId>jzlib</artifactId> <version>1.0.7</version> </dependency>

    这是我在maven中加载的包 如果不是在maven中使用ftp上传 可以直接网上搜索 groupId+artifactId+version

    配置文件

    #ftp相关配置 FTP.ADDRESS=192.168.26.137 FTP.PORT=22 FTP.USERNAME=zsh FTP.PASSWORD=zsh FTP.BASEPATH=/home/zsh/images #图片服务器相关配置 IMAGE.BASE.URL=http://192.168.26.138/images

    配置相关请根据自己的情况进行修改

    控制器

    package org.aptech.hdax.easybuy.webapi.controller; import org.aptech.hdax.easybuy.webapi.dao.UserDao; import org.aptech.hdax.easybuy.webapi.pojo.User; import org.aptech.hdax.easybuy.webapi.utils.FtpUtils; import org.aptech.hdax.easybuy.webapi.utils.IdUtils; import org.aptech.hdax.easybuy.webapi.utils.MySpecification; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import javax.transaction.Transactional; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.Map; @RestController @RequestMapping("/user") @CrossOrigin("*") public class UserController { // ftp地址 @Value("${FTP.ADDRESS}") private String host; // 端口 @Value("${FTP.PORT}") private int port; // ftp用户名 @Value("${FTP.USERNAME}") private String userName; // ftp用户密码 @Value("${FTP.PASSWORD}") private String passWord; // 文件在服务器端保存的主目录 @Value("${FTP.BASEPATH}") private String basePath; // 访问图片时的基础url @Value("${IMAGE.BASE.URL}") private String baseUrl; @Autowired private UserDao userDao; @RequestMapping("/pic/upload") @ResponseBody @Transactional public String pictureUpload( @RequestParam("file") MultipartFile uploadFile, @RequestParam("id")String id, HttpServletRequest request) { String filePath=""; try { //1、给上传的图片生成新的文件名 //1.1获取原始文件名 String oldName = uploadFile.getOriginalFilename(); //1.2使用IDUtils工具类生成新的文件名,新文件名 = newName + 文件后缀 String newName = IdUtils.genImageName(); newName = newName + oldName.substring(oldName.lastIndexOf(".")); //2、把前端输入信息,包括图片的url保存到数据库 User user =userDao.getOne(Integer.parseInt(id)); user.setPhoto(newName); //获取文件的绝对路径 //3、把图片上传到图片服务器 //3.1获取上传的io流 InputStream input = uploadFile.getInputStream(); //3.2调用FtpUtil工具类进行上传 boolean result = FtpUtils.uploadFile(host, port, userName, passWord, basePath, filePath, newName, input); if(result) { return "success"; }else { return "false"; } } catch (IOException e) { return "false"; } } }

    文件上传工具类

    package org.aptech.hdax.easybuy.webapi.utils; import com.jcraft.jsch.Channel; import com.jcraft.jsch.ChannelSftp; import com.jcraft.jsch.JSch; import com.jcraft.jsch.Session; import org.apache.commons.net.ftp.*; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.SocketException; import java.util.Properties; public class FtpUtils { private static ChannelSftp sftp = null; /** * Description: 向FTP服务器上传文件 * @param host FTP服务器ip * @param port FTP服务器端口 * @param username FTP登录账号 * @param password FTP登录密码 * @param basePath FTP服务器基础目录,/home/ftpuser/images * @param filePath FTP服务器文件存放路径。例如分日期存放:/2018/05/28。文件的路径为basePath+filePath * @param filename 上传到FTP服务器上的文件名 * @param input 输入流 * @return 成功返回true,否则返回false */ public static boolean uploadFile(String host, int port, String username, String password, String basePath, String filePath, String filename, InputStream input) { boolean result = false; FTPClient ftp = new FTPClient(); File file=null; try { JSch jsch = new JSch(); //获取sshSession 账号-ip-端口 Session sshSession = jsch.getSession(username, host, port); //添加密码 sshSession.setPassword(password); Properties sshConfig = new Properties(); //严格主机密钥检查 sshConfig.put("StrictHostKeyChecking", "no"); sshSession.setConfig(sshConfig); //开启sshSession链接 sshSession.connect(); //获取sftp通道 Channel channel = sshSession.openChannel("sftp"); //开启 channel.connect(); sftp = (ChannelSftp) channel; file=new File(basePath); //设置为被动模式 ftp.enterLocalPassiveMode(); //设置上传文件的类型为二进制类型 //进入到要上传的目录 然后上传文件 sftp.cd(basePath); sftp.put(input,filename); input.close(); result = true; } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } finally { if (ftp.isConnected()) { try { ftp.disconnect(); } catch (IOException ioe) { } } } return result; } }

    生成文件名工具类

    这个工具类是防止文件名重复,随机生成一个id

    package org.aptech.hdax.easybuy.webapi.utils; import java.util.Random; public class IdUtils { public static String genImageName() { //取当前时间的长整形值包含毫秒 long millis = System.currentTimeMillis(); //long millis = System.nanoTime(); //加上三位随机数 Random random = new Random(); int end3 = random.nextInt(999); //如果不足三位前面补0 String str = millis + String.format("d", end3); return str; } }

    由于是本人第一次使用sftp进行文件上传与下载,会有一些代码冗余或bug,请各位大神不吝啬做出指点.

    最新回复(0)