SFTP上传,Java实现

maven依赖`

 <!--  新版本SFTP上传  -->
        <dependency>
            <groupId>com.jcraft</groupId>
            <artifactId>jsch</artifactId>
            <version>0.1.54</version>
        </dependency>
package com.ltmonitor.web.controller;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.util.UUID;

/**
 * @Description
 * @Author MissYu
 * @Date 2020/6/3 14:54
 * @Classname UploadUtil
 * 支持文件或者图片的上传,SFTP
 * * SFTP是Secure File Transfer Protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的加密方法。<br>
 * * SFTP 为 SSH的一部份,是一种传输文件到服务器的安全方式。SFTP是使用加密传输认证信息和传输的数据,所以,使用SFTP是非常安全的。<br>
 * * 但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多,如果您对网络安全性要求更高时,可以使用SFTP代替FTP。<br>
 */
@RestController
@RequestMapping("/uploadImage")
public class SftpUploadController {

    private static ChannelSftp sftp = null;
    //ftp服务器ip地址
    private static final String FTP_ADDRESS = "192.168.1.***";
    //端口号,SFTP用的是Linux账号密码,注意.
    private static final int FTP_PORT = 55555;
    //用户名
    private static final String FTP_USERNAME = "****";
    //密码
    private static final String FTP_PASSWORD = "**********";
    //附件路径,自定义
    public static final String FTP_BASEPATH = "/media/baseImage/01";
    //访问路径
    private static final String pathPrefix = "http://192.168.1.***:8012/media/baseImage/01/";

    /**
     * 上传图片或者文件到服务器
     * file不用传递参数,它是一个流文件,file有没有都没有意义.
     *
     * @param file,
     * @return
     * @throws IOException
     */
    @RequestMapping("/newFtpUpload")
    public static String newFtpUpload(@RequestParam("file") MultipartFile file) throws IOException {
        //获取到文件的文件名
        String fileName = file.getOriginalFilename();
        //根据文件名+UUID生产新的文件名
        String newFileName = UUID.randomUUID() + fileName;
        //从MultipartFile对象中获取流
        InputStream inputStream = null;
        inputStream = file.getInputStream();
        //判断是否成功的boolean值
        boolean success = false;
        String path = "";
        //Session对象
        Session session = null;
        try {
            //创建JSch对象
            JSch jSch = new JSch();
            //调用JSch对象的getSession方法(参数是服务器的访问用户名,服务器访问路径,服务器的端口号)给session赋值
            session = jSch.getSession(FTP_USERNAME, FTP_ADDRESS, FTP_PORT);
            //给session对象设置密码参数也就是你的服务器访问的密码
            session.setPassword(FTP_PASSWORD);
            //创建参数
            Properties sshConfig = new Properties();
            //给参数对象赋值,这里解决
            sshConfig.put("StrictHostKeyChecking", "no");
            //这里设置参数给session主要解决把kerberos认证方式去掉,如果不写这一步走到这里你需要向控制台输入你的
            // kerberos用户名和口令,如果你的项目环境没有涉及到kerberos应该是不用设置
            session.setConfig("PreferredAuthentications", "publickey,keyboard-interactive,password");
            //把参数对象给session对象注入
            session.setConfig(sshConfig);
            //打开session连接
            session.connect(15000);
            //使用session对象连接服务器
            Channel channel = session.openChannel("sftp");
            channel.connect();
            sftp = (ChannelSftp) channel;
            //使用ChannelSftp对象进行使用命令
            //进入需要进入的路径
            sftp.cd(FTP_BASEPATH);
            //进行文件上传
            sftp.put(inputStream, newFileName);
            //设置上传成功
            success = true;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //关闭连接
            if (sftp != null) {
                if (sftp.isConnected()) {
                    sftp.disconnect();
                }
            }
            //关闭session
            if (session != null) {
                if (session.isConnected()) {
                    session.disconnect();
                }
            }
        }
        //判断是否成功
        if (success) {
            //设置返回路径为访问路径(你的服务器访问路径+新文件名)
            path = pathPrefix + newFileName;
            //response.getSession().getServletContext().getRealPath("/")
        }
        return path;
    }

}

controller无法本地,测试这里配上postman测试截图
如果你需要登录的话,需要先登录,提醒.
在这里插入图片描述
结束,

猜你喜欢

转载自blog.csdn.net/weixin_45029766/article/details/106559694