文件上传到远程服务器

news2024/11/15 15:32:02

文件上传

一、上传文件到本地

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();
                }
            }
    
        }
    }
    
    

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MyBatis缓存-提高检索效率的利器--二级缓存

文章目录 缓存-提高检索效率的利器缓存-官方文档二级缓存基本介绍二级缓存原理图 二级缓存快速入门快速入门注意事项和使用陷阱理解二级缓存策略的参数 四大策略如何禁用二级缓存mybatis 刷新二级缓存的设置 缓存-提高检索效率的利器 缓存-官方文档 文档地址: https://mybati…

低代码平台实际解决了哪些问题?

一、前言 目前低代码平台如火如荼。这一新兴技术为企业提供了一种高效、灵活、快速开发应用程序的方法&#xff0c;并在短时间内取得了巨大成功。然而&#xff0c;我们不得不面对低代码平台的优劣以及其所带来的挑战。本文将深入探讨低代码平台在不同情况下的优劣势&#xff0c…

找不到Windows SDK版本 10.0.18362.0.请安装所需版本的 Windows SDK,或者在项目属性页中或通过右键单击解决

找不到Windows SDK版本 10.0.18362.0.请安装所需版本的 Windows SDK,或者在项目属性页中或通过右键单击解决 安装相应的组件 项目——重定目标解决方案——然后选择版本

Electron逆向调试

复杂程序处理方式&#xff1a; 复杂方式通过 调用窗口 添加命令行参数 启动允许调用&#xff0c;就可以实现调试发布环境的electron程序。 断点调试分析程序的走向&#xff0c;程序基本上会有混淆代码处理&#xff0c; 需要调整代码格式&#xff0c;处理程序。

XGBoost的基础思想与实现

目录 1. XGBoost VS 梯度提升树 1.1 XGBoost实现精确性与复杂度之间的平衡 1.2 XGBoost极大程度地降低模型复杂度、提升模型运行效率 1.3 保留了部分与梯度提升树类似的属性 2. XGBoost回归的sklearnAPI实现 2.1 sklearn API 实现回归 2.2 sklearn API 实现分类 3. XGBo…

HCIP--云计算题库 V5.0版本

在国家政策的支持下&#xff0c;我国云计算应用市场发展明显加快&#xff0c;越来越多的企业开始介入云产业&#xff0c;出现了大量的应用解决方案&#xff0c;云应用的成功案例逐渐丰富&#xff0c;用户了解和认可程度不断提高&#xff0c;云计算产业发展迎来了“黄金机遇期”…

第一百一十九天学习记录:感谢CSDN对一个大龄程序员的鼓励

在经历了一百多天的学习之后&#xff0c;不仅感觉学习之路道阻且长&#xff0c;反而因为好多需要学习的东西而开始有点士气低迷&#xff0c;结果CSDN官方的一条私信再次鼓舞了我。 我在坚持平均每天写一篇学习记录。结果没想到居然能拿到CSDN活动的奖励。 这无疑是对我持续学习…

死锁产生的原因及解决方案

死锁 1. 死锁的成因2. 解决方案 1. 死锁的成因 互斥条件: 一个资源每次只能被一个进程使用。请求与保持条件&#xff1a;一个进程因请求资源而阻塞时&#xff0c;对已获得的资源保持不放。不可剥夺条件:进程已获得的资源&#xff0c;在末使用完之前&#xff0c;不能强行剥夺。…

详解FreeRTOS:FreeRTOS程序启动流程(基础篇—5)

裸机系统上电时第一个执行的是启动文件里由汇编编写的复位函数Reset_Handler,复位函数最后会调用 C 库函数__main,__main 函数的主要工作是初始化系统的堆和栈,最后调用 C 中的 main 函数。如下图所示: 1、创建任务 在 main()函数中,我们直接可以对 FreeRTOS 进行创建任务…

iOS开发-实现热门话题标签tag显示控件

iOS开发-实现热门话题标签tag显示控件 话题标签tag显示非常常见&#xff0c;如选择你的兴趣&#xff0c;选择关注的群&#xff0c;超话&#xff0c;话题等等。 一、效果图 二、实现代码 由于显示的是在列表中&#xff0c;这里整体控件是放在UITableViewCell中的。 2.1 标签…

使用vscode进行远程开发服务器配置

1.下载vscode 2.给vscode 安装python 和 remote ssh插件 remote—SSH扩展允许您使用任何具有SSH服务器的远程机器作为您的开发环境。 3.安装remote-SSH插件之后&#xff0c;vscode左侧出现电脑图标&#xff0c;即为远程服务&#xff0c;按图依次点击&#xff0c;进行服务器配置…

拿捏--->乘法口诀表

文章目录 前言左下角左上角右下角右上角等腰三角形 前言 九九乘法表,我们从小学就已经了解并且学习了,九九乘法表的历史距今已经有2千多年的历史了。那我们如何使用c语言来输出九九乘法口诀表呢,我们一起来看一看。 我们了解的九九乘法口诀表是这样的&#xff1a; 那我们如…

CPU Architecture Methodologies

MMU MMU(Memory Management Unit) 负责将逻辑地址转化为物理地址对于现代处理器来说&#xff0c;一般每个core都有自己的 MMU页表等数据结构保存在 TLB NUMA Non-uniform memory access (NUMA) is a computer memory design used in multiprocessing, where the memory access…

每日一题——只出现一次的数字(III)

只出现一次的数字——III 题目链接 注&#xff1a;本题的解法建立在位运算——异或和题目《只出现一次的数字——I》之上&#xff0c;如果对这些内容不太熟悉&#xff0c;建议先看看&#xff1a; 位运算详解 只出现一次的数字——I 思路 我们先来回顾一下异或的特性&#x…

事务的隔离级别以及传播机制的详细讲解

1.为什么需要事务&#xff1f; 事务就是将一组操作封装成一个执行单元&#xff0c;要么全部执行成功&#xff0c;要么全部执行失败 ⽐如转账分为两个操作&#xff1a; 第⼀步操作&#xff1a;A 账户 -100 元第⼆步操作&#xff1a;B 账户 100 元 如果没有事务&#xff0c;第⼀…

nodejs的字符串文字(‘‘)和模板文字(``)性能比较

nodejs的字符串文字(‘’)和模板文字()性能比较 js支持两种方式定义字符串&#xff1a; 使用 const str "Hello " "world!";使用 const worldText "world!" const str Hello ${worldText};我们可能不会太关注这些&#xff0c;应该都是怎…

同步锁: synchronized

synchronized 1. synchronized的特性2. synchronized的使用3. synchronized的锁机制 1. synchronized的特性 原子性: 所谓原子性就是指一个操作或者多个操作&#xff0c;要么全部执行并且执行的过程不会被任何因素打断&#xff0c;要么就都不执行。可见性: 可见性是指多个线程…

Minecraft 1.20.x Forge模组开发 05.矿石生成

我们本次尝试在主世界生成模组中自定义的矿石 效果演示 效果演示 效果演示 1.由于1.20的版本出现了深板岩层的矿石,我们要在BlockInit类中声明一个矿石的两种岩层形态: BlockInit.java package com.joy187.re8joymod.init;import java.util.function.Function;import java…

无涯教程-jQuery - scrollLeft( val )方法函数

scrollLeft(val)方法用于将所有匹配元素上的向左滚动偏移量设置为传递的值。 此方法适用于可见和隐藏元素。 scrollLeft( val ) - 语法 selector.scrollLeft( val ) 这是此方法使用的所有参数的描述- val - 代表所需滚动左偏移量的正数。 scrollLeft( val ) - 示例 以…

【css】边框border

边框border 1、border-style 属性指定要显示的边框类型 dotted - 定义点线边框dashed - 定义虚线边框solid - 定义实线边框double - 定义双边框groove - 定义 3D 坡口边框。效果取决于 border-color 值ridge - 定义 3D 脊线边框。效果取决于 border-color 值inset - 定义 3D …