文件上传到远程服务器

文件上传

一、上传文件到本地

package com.ruoyi.system.knowledgebase;

import com.ruoyi.common.annotation.Anonymous;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.system.domain.SzKnowledge;
import com.ruoyi.system.service.ISzKnowledgeService;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;

@RestController
@RequestMapping("/KnowledgeUpload")
public class KnowledgeUpload {


    @Autowired
    private ISzKnowledgeService szKnowledgeService;


    @Anonymous
    @PostMapping("/upload")
    public AjaxResult uploadToLocal(@Param("file") MultipartFile file, @Param("userId")String userId){
        // 获取文件原本的名字
        String originName = file.getOriginalFilename();
        // 判断文件是否是pdf文件
        Set<String> set = new HashSet<>();
        set.add(".docx");
        set.add(".doc");
        set.add(".xls");
        set.add(".xlsx");
        set.add(".pdf");
        // 取出文件的后缀
        int count = 0;
        for(int i = 0; i < originName.length(); i++){
            if(originName.charAt(i) == '.'){
                count = i;
                break;
            }
        }
        String endName = originName.substring(count); //取出文件类型
        if(!set.contains(endName)){
            return AjaxResult.error("上传的文件类型错误");
        }

        // 创建保存路径
        //日期格式
//        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
//        String format = sdf.format(new Date());

        String savePath = "D:\\Apache24\\htdocs\\knowledge_user";
//        String savePath = "/var/www/html/upload_file";

        // 保存文件的文件夹
        File folder = new File(savePath);
        // 判断路径是否存在,不存在则自动创建
        if(!folder.exists()){
            folder.mkdirs();
        }

        //截取后缀
        final String suffix = originName.substring(originName.lastIndexOf("."));
        //为文件命名
        final String finalName = UUID.randomUUID() + suffix;
        //String saveName = originName;
        System.out.println("finalName = " + finalName);
        try {

            // 保存文件到磁盘
            file.transferTo(targetFile);
            String saveAi = "http://xxx.xxxx.x.x:9012/knowledge/" + finalName;

            return AjaxResult.success("上传成功", saveAi);
        } catch (IOException e){
            return AjaxResult.error("上传失败");
        }
    }

}

二、上传文件到远程服务器(SFTP)

 <!--sftp文件上传-->
        <dependency>
            <groupId>com.jcraft</groupId>
            <artifactId>jsch</artifactId>
            <version>0.1.54</version>
        </dependency>
package com.ruoyi.system.knowledgebase;
 
 
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.*;
 
import java.io.*;
import java.util.HashSet;
import java.util.Set;


public class FtpUtils {
 
    /**
     * 利用JSch包实现SFTP上传文件
     * @param bytes  文件字节流
     * @param fileName  文件名
     * @throws Exception
     */
    public static void sshSftp(byte[] bytes,String fileName) throws Exception{
        //指定的服务器地址
        String ip = "43.XXX.XXX.XX";
        //用户名
        String user = "XXXXX";
        //密码
        String password = "XXXXX";
        //服务器端口 默认22
        int port = 22;
        //上传文件到指定服务器的指定目录 自行修改
        String path = "/root";
 
        Session session = null;
        Channel channel = null;
 
 
        JSch jsch = new JSch();
 
 
        if(port <=0){
            //连接服务器,采用默认端口
            session = jsch.getSession(user, ip);
        }else{
            //采用指定的端口连接服务器
            session = jsch.getSession(user, ip ,port);
        }
 
        //如果服务器连接不上,则抛出异常
        if (session == null) {
            throw new Exception("session is null");
        }
 
        //设置登陆主机的密码
        session.setPassword(password);//设置密码
        //设置第一次登陆的时候提示,可选值:(ask | yes | no)
        session.setConfig("StrictHostKeyChecking", "no");
        //设置登陆超时时间
        session.connect(30000);
 
 
        OutputStream outstream = null;
        try {
            //创建sftp通信通道
            channel = (Channel) session.openChannel("sftp");
            channel.connect(1000);
            ChannelSftp sftp = (ChannelSftp) channel;
 
 
            //进入服务器指定的文件夹
            sftp.cd(path);
 
            //列出服务器指定的文件列表
//            Vector v = sftp.ls("*");
//            for(int i=0;i<v.size();i++){
//                System.out.println(v.get(i));
//            }
 
            //以下代码实现从本地上传一个文件到服务器,如果要实现下载,对换以下流就可以了
            outstream = sftp.put(fileName);
            outstream.write(bytes);
 
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //关流操作
            if(outstream != null){
                outstream.flush();
                outstream.close();
            }
            if(session != null){
                session.disconnect();
            }
            if(channel != null){
                channel.disconnect();
            }
        }
    }

    public static boolean isAllowedFileType(String fileName) {
        // 允许上传的文件类型
        Set<String> allowedTypes = new HashSet<>();
        allowedTypes.add(".doc");
        allowedTypes.add(".docx");
        allowedTypes.add(".pdf");
        allowedTypes.add(".xls");
        allowedTypes.add(".xlsx");
        // 获取文件的后缀
        int count = fileName.lastIndexOf(".");
        String endName = fileName.substring(count).toLowerCase();
        return allowedTypes.contains(endName);
    }


}
package com.ruoyi.system.knowledgebase;
 
import com.ruoyi.system.service.ISzKnowledgeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.util.UUID;

import static com.ruoyi.system.knowledgebase.FtpUtils.isAllowedFileType;


@RestController
@RequestMapping("/KnowledgeUpload")
public class FileUpload
{
    @Autowired
    private ISzKnowledgeService szKnowledgeService;

    @RequestMapping("/file")
    public void upload(MultipartFile file){
        String fileName = file.getOriginalFilename();
        //截取后缀
        final String suffix = fileName.substring(fileName.lastIndexOf("."));
        //为文件命名
        final String finalName = UUID.randomUUID() + suffix;

        if (!isAllowedFileType(fileName)) {
            System.out.println("上传的文件类型错误");
            return;
        }

        try {
            byte[] bytes = file.getBytes();
            FtpUtils.sshSftp(bytes,finalName);

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
 
}

APIfox接口测试

三、文件上传到云存储服务器

  • 使用七牛云进行文件上传http://t.csdn.cn/qONcF

  • 使用阿里云oss进行文件上传

    阿里云oss对象存储:http://t.csdn.cn/dYmsq

        //采集并上传音频到oss服务器
        @Anonymous
        @PostMapping("/uploadAudio")
        public String  uploadAudio(@RequestParam("audioFile") MultipartFile audioFile,
                                      @RequestParam("voiceName") String voiceName,
                                      @RequestParam("audioId") String audioId) {
    
            String response = UploadController.uploadAudio(audioFile,voiceName,audioId);
            return response;
        }
    
    
    public class AliYunConstants {
        public static final String ACCESSKEY_ID = "xxxxxxxxxxxx";
        public static final String ACCESSKEY_SECRET = "xxxxxxxxxxxxx";
    }
    
    package com.ruoyi.system.soundcloing;
    
    import com.aliyun.oss.ClientException;
    import com.aliyun.oss.OSS;
    import com.aliyun.oss.OSSClientBuilder;
    import com.aliyun.oss.OSSException;
    import com.ruoyi.common.annotation.Anonymous;
    import com.ruoyi.common.core.domain.AjaxResult;
    import com.ruoyi.system.controller.AliYunConstants;
    import org.springframework.web.bind.annotation.PostMapping;
    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.ByteArrayInputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    
    
    @RestController
    @RequestMapping("/upload")
    public class UploadController {
    
        // 阿里云 OSS 的 Endpoint
        private static final String OSS_ENDPOINT = "http://oss-cn-beijing.aliyuncs.com";
        private static final String OSS_ENDPOINT2 = "http://oss-cn-hangzhou.aliyuncs.com";
    
        //阿里云存储地址1
        private static final String OSS_AUDIOURL = "https://xxxx.oss-cn-beijing.aliyuncs.com/";
        private static final String OSS_AUDIOURL2 = "https://xxxx.oss-cn-hangzhou.aliyuncs.com/";
    
    
    
        // 阿里云 OSS 的 Bucket 名称
        private static final String OSS_BUCKET_NAME = "xxxx";
        private static final String OSS_BUCKET_NAME2 = "xxxxx";
    
    
        //文件上传测试接口
        @Anonymous
        @PostMapping("/audio")
        public AjaxResult upload(@RequestParam("audioFile") MultipartFile audioFile,
                                    @RequestParam("voiceName") String voiceName,
                                    @RequestParam("audioId") String audioId){
            // 初始化 OSS 客户端
            OSS ossClient = new OSSClientBuilder().build(OSS_ENDPOINT, AliYunConstants.ACCESSKEY_ID, AliYunConstants.ACCESSKEY_SECRET);
    
            try {
                // 上传的 Object 完整路径,例如:soundcloning/voiceName/audioId.png
                String objectName = "soundcloning/" + voiceName + "/" + audioId + ".wav";
    
                // 将录音文件上传到 OSS
                ossClient.putObject(OSS_BUCKET_NAME, objectName, new ByteArrayInputStream(audioFile.getBytes()));
                String result = OSS_AUDIOURL+ objectName;
                return AjaxResult.success("音频文件上传成功",result);
    //            return "音频文件上传成功,Object 完整路径为:"+ OSS_ENDPOINT+ objectName;
            } catch (OSSException oe) {
                // 处理 OSS 异常
                return AjaxResult.error("上传失败,OSS 异常", oe.getMessage());
    //            return "上传失败,OSS 异常:" + oe.getMessage();
            } catch (ClientException ce) {
                // 处理 OSS Client 异常
                return AjaxResult.error("上传失败,OSS 异常", ce.getMessage());
    //            return "上传失败,OSS Client 异常:" + ce.getMessage();
            } catch (IOException e) {
                // 处理文件读取异常
                return AjaxResult.error("上传失败,OSS 异常",e.getMessage());
    //            return "上传失败,文件读取异常:" + e.getMessage();
            } finally {
                // 关闭 OSS 客户端
                if (ossClient != null) {
                    ossClient.shutdown();
                }
            }
    
        }
    
        public static String  uploadAudio( MultipartFile audioFile, String voiceName, String audioId){
            // 初始化 OSS 客户端
            OSS ossClient = new OSSClientBuilder().build(OSS_ENDPOINT, AliYunConstants.ACCESSKEY_ID, AliYunConstants.ACCESSKEY_SECRET);
    
            try {
                // 上传的 Object 完整路径,例如:soundcloning/voiceName/audioId.png
                String objectName = "soundcloning/" + voiceName + "/" + audioId + ".wav";
    //            String objectName = "soundcloning/" + voiceName + "/" + audioId;
    
    
    //            File file = AudioProcessing.uploadAudioAsFile(audioFile);
    
                // 将MultipartFile转换为File
    //            File newFile = new File(audioFile.getOriginalFilename());
    //            FileUtils.copyInputStreamToFile(audioFile.getInputStream(), newFile);
    
                // 将录音文件上传到 OSS
                ossClient.putObject(OSS_BUCKET_NAME, objectName, new ByteArrayInputStream(audioFile.getBytes()));
    //            ossClient.putObject(OSS_BUCKET_NAME, objectName,new FileInputStream(newFile));
    //            ossClient.putObject(OSS_BUCKET_NAME, objectName,new FileInputStream(file));
                String result = OSS_AUDIOURL+ objectName;
    
                return result;
            } catch (OSSException oe) {
                // 处理 OSS 异常
                return "上传失败,OSS 异常:" + oe.getMessage();
            } catch (ClientException ce) {
                // 处理 OSS Client 异常
                return "上传失败,OSS Client 异常:" + ce.getMessage();
            } catch (IOException e) {
                // 处理文件读取异常
                return "上传失败,文件读取异常:" + e.getMessage();
            } finally {
                // 关闭 OSS 客户端
                if (ossClient != null) {
                    ossClient.shutdown();
                }
            }
    
        }
    }
    
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/53160.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于物联网、视频监控与AI视觉技术的智慧电厂项目智能化改造方案

一、项目背景 现阶段&#xff0c;电力行业很多企业都在部署摄像头对电力巡检现场状况进行远程监控&#xff0c;但是存在人工查看费时、疲劳、出现问题无法第一时间发现等管理弊端&#xff0c;而且安全事件主要依靠人工经验判断分析、管控&#xff0c;效率十分低下。 为解决上述…

vue生命周期的传统写法和setup语法糖写法

&#x1f642;博主&#xff1a;小猫娃来啦 &#x1f642;文章核心&#xff1a;vue生命周期的传统写法和setup语法糖写法 文章目录 setup语法糖设计目的Vue2 与Vue3的生命周期对比vue3钩子函数beforeCreated和created被封装传统写法和语法糖写法的对比 setup语法糖设计目的 <…

容器部署jenkins定时构建于本地时间不一致

1. Dockerfile FROM jenkins/jenkins:2.411-jdk11 USER root #以下生成密钥方式为旧格式&#xff0c;因为新格式暂不能被"Publish over SSH--->Jenkins SSH Key"功能识别 RUN ssh-keygen -q -m PEM -t rsa -b 2048 -N -f /root/.ssh/id_rsa ADD ./apache-maven…

【Boost搜索引擎项目】

文章目录 一、项目流程二、项目展示 一、项目流程 1.编写数据去标签模块–parser.cc 将去标签之后干净文档以title\3content\3url\ntitle\3content\3url\n格式放入同一文件中。 2.建立索引模块–index.hpp 读取处理好的行文本文件进行分词、权重计算等操作&#xff0c;在内存中…

在linux上面部署activemq

1、下载 网址&#xff1a;ActiveMQ 注意&#xff1a;新版本5.17起 要求jdk11, 5.16兼容jdk8, 所以&#xff0c;确保已经安装 java11 或以上的版本 这里安装较新版&#xff1a;5.18.2&#xff0c;已经安装了java17 如何安装jdk17,请详见我的另一篇文章&#xff1a;linux…

Leetcode-每日一题【剑指 Offer II 075. 数组相对排序】

题目 给定两个数组&#xff0c;arr1 和 arr2&#xff0c; arr2 中的元素各不相同 arr2 中的每个元素都出现在 arr1 中 对 arr1 中的元素进行排序&#xff0c;使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。 示例&…

AI For Engineers 线上参会指南

AI For Engineers 线上参会指南 欢迎您报名参加 AI For Engineers&#xff1a;工程师 AI 全球会议&#xff0c;为了让各位参会者参会体验更佳&#xff0c;更好地利用本次会议收获更多。Altair 特别为各位准备了线上参会指南&#xff0c;一起来看看吧~ 会议时间&#xff1a;20…

组合模式——树形结构的处理

1、简介 1.1、概述 树形结构在软件中随处可见&#xff0c;例如操作系统中的目录结构、应用软件中的菜单、办公系统中的公司组织结构等。如何运用面向对象的方式来处理这种树形结构是组合模式需要解决的问题。组合模式通过一种巧妙的设计方案使得用户可以一致性地处理整个树形…

第3章 DOM

文档&#xff1a;DOM中的“D” 如果没有document&#xff08;文档&#xff09;, DOM也就无从谈起。当创建了一个网页并把它加载到Web浏览器中时&#xff0c;DOM就在幕后悄然而生。它把你编写的网页文档转换为一个文档对象。 对象&#xff1a;DOM中的“O” js中的对象分为三种…

森林中的兔子(力扣)数学思维 JAVA

森林中有未知数量的兔子。提问其中若干只兔子 “还有多少只兔子与你&#xff08;指被提问的兔子&#xff09;颜色相同?” &#xff0c;将答案收集到一个整数数组 answers 中&#xff0c;其中 answers[i] 是第 i 只兔子的回答。 给你数组 answers &#xff0c;返回森林中兔子的…

第5集丨webpack 江湖 —— 项目发布 和 source map

目录 一、webpack项目发布1.1 新增发布(build)命令1.2 优化js和图片文件的存放路径1.3 执行1.4 效果 二、clean-webpack-plugin插件2.1 安装2.2 配置2.3 执行 三、source map3.1 配置3.2 生成的source map文件 四、定义符4.1 配置4.2 使用 五、工程附件汇总5.1 webpack.config.…

【Python数据分析】Python常用内置函数(二)

&#x1f389;欢迎来到Python专栏~Python常用内置函数&#xff08;二&#xff09; ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;Python学习专栏 文章作者技术和水平有限&#xff0c;如果文…

小程序 获取用户头像、昵称、手机号的组件封装(最新版)

在父组件引入该组件 <!-- 授权信息 --><auth-mes showModal"{{showModal}}" idautnMes bind:onConfirm"onConfirm"></auth-mes> 子组件详细代码为: authMes.wxml <!-- components/authMes/authMes.wxml --> <van-popup show…

GuLi商城-前端基础Vue

MVVM思想 M&#xff1a;即Model&#xff0c;模型&#xff0c;包括数据和一些基本操作 V&#xff1a;即View&#xff0c;视图&#xff0c;页面渲染结果 VM&#xff1a;即View-Model&#xff0c;模型与视图间的双向操作&#xff08;无需开发人员干涉&#xff09; Vue.js - 渐…

【计算机视觉|人脸建模】3D人脸重建基础知识(入门)

本系列博文为深度学习/计算机视觉论文笔记&#xff0c;转载请注明出处 一、三维重建基础 三维重建&#xff08;3D Reconstruction&#xff09;是指根据单视图或者多视图的图像重建三维信息的过程。 1. 常见三维重建技术 人工几何模型仪器采集基于图像的建模描述基于几何建模…

Python:给MySQL创建1000张表和创建1张有50个字段的表

1、创建1000张表 import pymysqldbhost "10.1.1.143" dbuser "root" dbpassword "123456" dbname "demo_cg1000" dbport 3306 dbconn pymysql.connect(hostdbhost, userdbuser, passworddbpassword, dbdbname, portdbport)mycu…

Ansible单yaml文件部署Zabbix5.0监控平台

文章目录 Ansible单yaml文件部署Zabbix5.0监控平台节点规划案例实施基础环境准备编写剧本文件ZabbixWeb界面(1)改中文(2)添加监控主机 Ansible单yaml文件部署Zabbix5.0监控平台 节点规划 IP主机名节点192.168.200.10ansibleAnsible节点192.168.200.20zabbix-serverZabbix-ser…

【Python系列】Python基础语法轻松入门—从变量到循环

目录 写在前面 语法介绍 变量 数据类型 整数 浮点数 字符串 列表 元组 字典 运算符 算术运算符 比较运算符 逻辑运算符 条件语句 循环语句 图书推荐 图书介绍 参与方式 中奖名单 写在前面 Python 是一种高级、解释型的编程语言&#xff0c;具有简单易学…

iPhone 安装 iOS 17公测版(Public Beta)

文章目录 步骤1. 备份iPhone资料步骤2. 申请iOS 17 公测Beta 资格步骤3. 下载iOS 16 Beta 公测描述档步骤4. 选择iOS 17 Beta 公测描述档更新项目步骤5. 升级iOS 17 Public Beta 公开测试版 苹果已经开始向大众释出首个iOS 17 公开测试版/ 公测版( iOS 17 Public Beta)&#xf…

【javaSE】 面向对象程序三大特性之继承

目录 为什么需要继承 继承的概念 继承的语法 注意事项 父类成员访问 子类中访问父类的成员变量 子类和父类不存在同名成员变量 子类和父类成员变量同名 访问原则 子类中访问父类的成员方法 成员方法名字不同 总结&#xff1a; 成员方法名字相同 总结&#xff1a; …