对于JAVA实现SFTP实例 SpringBoot实现 SSH-2.0-OpenSSH_5.3错误解决

使用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("%03d", end3);

        return str;
    }
}

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这个错误可能是因为您正在使用的FTP服务器并不是标准的FTP协议,而是使用了SSH协议。要连接到使用SSH协议的FTP服务器,您需要使用SFTP而不是FTP协议。可以尝试使用JSch库来连接SFTP服务器。 以下是使用JSch连接SFTP服务器的示例代码: ```java import com.jcraft.jsch.*; public class SFTPExample { public static void main(String[] args) { String host = "sftp.example.com"; String username = "username"; String password = "password"; int port = 22; Session session = null; Channel channel = null; ChannelSftp sftpChannel = null; try { JSch jsch = new JSch(); session = jsch.getSession(username, host, port); session.setPassword(password); session.setConfig("StrictHostKeyChecking", "no"); session.connect(); channel = session.openChannel("sftp"); channel.connect(); sftpChannel = (ChannelSftp) channel; // 在这里可以执行SFTP操作,例如上传/下载/删除文件等 // 例如,上传本地文件到远程服务器: sftpChannel.put("localFile.txt", "remoteFile.txt"); } catch (JSchException | SftpException e) { e.printStackTrace(); } finally { if (sftpChannel != null) { sftpChannel.exit(); } if (channel != null) { channel.disconnect(); } if (session != null) { session.disconnect(); } } } } ``` 您需要将`host`、`username`、`password`和`port`替换为您要连接的SFTP服务器的实际值。在示例代码中,我们使用`JSch`库创建一个SFTP会话并进行连接。然后,我们打开一个SFTP通道,并执行一些SFTP操作,例如将本地文件上传到远程服务器。最后,我们关闭SFTP通道和会话。 希望这可以解决您的问题!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值