栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java 通过FTP/sftp/channel上传图图片到文件服务器

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java 通过FTP/sftp/channel上传图图片到文件服务器

上传图片到服务器:
我遇到的相关问题,在末尾有总结
1、在application.yml配置文件中添加,FTP配置信息

  #ftp相关配置
FTP:
  ADDRESS: 192.168.服务器ip
  PORT: 22
  USERNAME: administrator
  PASSWORD: 123456
  basePATH: /imes/file
  servlet:
    multipart:
      # 单个文件大小
      max-file-size: 512MB
      # 设置总上传的文件大小
      max-request-size: 1024MB
IMAGE:
  base:
    URL: http://192.168.服务器ip/imes/file
   

2、写一个FTP工具类,用来连接服务器,上传文件到指定目录:

public class FtpUtils {
    private static ChannelSftp sftp = null;
    
    public static boolean uploadFile(String host, int port, String username, String password, String basePath, String filename, InputStream input, MultipartFile uploadFile) {
        boolean result = false;
        FTPClient ftp = new FTPClient();
        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;
            //进入服务器主导模式
            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;
    }

3、写一个工具类去调用,这个上边的FTP工具类:

 public static baseResponse pictureUpload(MultipartFile uploadFile) {
        try {
            //获得文件名,其他属性,一般用不上,建议直接跳到获取io流      
            String oldName = uploadFile.getOriginalFilename();
            //1.2使用IDUtils工具类生成新的文件名,新文件名 = newName + 文件后缀
            String newName = IDUtils.genImageName() + oldName.substring(oldName.lastIndexOf("."));
            //把文件的信息填入file对象
            FilePo filePo = new FilePo();
            filePo.setOldName(oldName);
            filePo.setNewName(newName);
            filePo.setFileType(type);
            filePo.setFileUrl(FTPenums.BATH_URL.getValue() + Fileenums.getDesc(code) + newName);     
            //获取   上传的io流
            InputStream input = uploadFile.getInputStream();
            //调用FtpUtil工具类进行上传
            //注:我这里调用方法,使用的参数,是我调用的枚举值,你们使用的话,直接上传相应的参数即可
            boolean result = FtpUtils.uploadFile(FTPenums.HOST.getValue(), Integer.parseInt(FTPenums.PORT.getValue()), FTPenums.USERNAME.getValue(),
                    FTPenums.PASSWORD.getValue(), FTPenums.base_PATH.getValue() + Fileenums.getDesc(code), newName, input, uploadFile);
            if (result) {
            //我这里还要把,文件地址,和名字存进数据库,看需求
            //这个地方可能会出现找不到mapper文件的情况,可以看我的上一篇博客,工具类找不到mapper文件的解决方法
                fileUTils.fileMapper.insert(filePo);
                return baseResponse.buildSuccessfulResponse(filePo.getId());
            } else {
                return baseResponse.buildFailedResponse("上传失败");
            }
        } catch (IOException e) {
            return baseResponse.buildFailedResponse("IO异常");
        }
    }

注:1、这个需要先在服务端建立文件夹
2、工具类调用mapper可能会出错,可查看该博客
3、这个方法所用的服务器,如果是一个盘就没问题。我这边使用的是一个主机服务器,windows,有三个盘,每次默认进的就是c盘,我的解决方法是basepath路径前边加上 /e:image/,这样就可以存到e盘。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/785279.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号