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

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

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

项目依赖

		
        
        
            commons-fileupload
            commons-fileupload
            1.3.2
        
        
            commons-io
            commons-io
            2.4
        
        
            commons-net
            commons-net
            3.3
        
        
            com.jcraft
            jsch
            0.1.49
        
        
        
            com.jcraft
            jzlib
            1.0.7
        

这是我在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,请各位大神不吝啬做出指点.

你可能感兴趣的:(Java)