SpringBoot实现OneDrive文件上传

SpringBoot实现OneDrive文件上传

源码

OneDriveUpload: SpringBoot实现OneDrive文件上传

获取accessToken步骤

参考文档:针对 OneDrive API 的 Microsoft 帐户授权 - OneDrive dev center | Microsoft Learn

1.访问Azure创建应用Microsoft Azure,使用微软账号进行登录即可!

2.进入应用创建密码

3.获取code

通过访问(必须用浏览器,通过地址栏输入的方式):https://login.live.com/oauth20_authorize.srf?client_id=你的应用程序(客户端) ID&scope=files.readwrite offline_access&response_type=code&redirect_uri=http://localhost:8080/redirectUri

以上步骤都正确的情况下,会在地址栏返回一个code,也就是M.C105.........

4.获取accessToken

拿到code后就可以拿token了,通过对https://login.live.com/oauth20_token.srf 发起POST请求并传递相关参数,这一步需要用接口调试工具完成!

其中client_id和redirect_uri与上面相同,client_secret填刚刚创建的密钥,code就是刚刚获取到的codegrant_type就填authorization_code即可!

正常情况下访问后就能得到access_token,然后把access_token放在springboot的配置文件中!

代码实现步骤

1. 新建一个springBoot项目,选择web依赖即可!

 2. 引入相关依赖

        <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.16</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.16</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.0</version></dependency>

3.编写文件上传接口类

参考文档:上传小文件 - OneDrive API - OneDrive dev center | Microsoft Learn

import com.alibaba.fastjson.JSONObject;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.*;
import org.springframework.stereotype.Controller;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletResponse;
import java.io.*;/*** 文件上传到OneDrive并将文件信息存储到Excel文件中*/
@Controller
public class FileSyncController {private static final Logger logger = LoggerFactory.getLogger(FileSyncController.class);private static final String ONE_DRIVE_BASE_URL = "https://graph.microsoft.com/v1.0/me/drive/root:/uploadfile/";@Value("${onedrive.access-token}")private String ACCESS_TOKEN;@PostMapping("/upload")public void uploadFileToDrive(@RequestParam("file") MultipartFile file, HttpServletResponse httpServletResponse) throws IOException {if (file.isEmpty()) {throw new RuntimeException("文件为空!");}String fileName = file.getOriginalFilename();String oneDriveUploadUrl = ONE_DRIVE_BASE_URL + fileName + ":/content";HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.MULTIPART_FORM_DATA);headers.setBearerAuth(ACCESS_TOKEN);HttpEntity<byte[]> requestEntity;try {byte[] fileBytes = file.getBytes();requestEntity = new HttpEntity<>(fileBytes, headers);} catch (Exception e) {throw new RuntimeException(e.getMessage());}RestTemplate restTemplate = new RestTemplate();ResponseEntity<String> response = restTemplate.exchange(oneDriveUploadUrl, HttpMethod.PUT, requestEntity, String.class);if (response.getStatusCode() == HttpStatus.CREATED) {//解析返回的JSON字符串,获取文件路径String downloadUrl = JSONObject.parseObject(response.getBody()).getString("@microsoft.graph.downloadUrl");storeFileInfoToExcel(fileName, downloadUrl);logger.info("文件上传成功,OneDrive 文件路径:" + downloadUrl);httpServletResponse.setCharacterEncoding("utf-8");httpServletResponse.setContentType("text/html;charset=utf-8");PrintWriter out = httpServletResponse.getWriter();out.print("<script> alert('" + fileName + "已上传成功!');window.location.href='file_info.xlsx';</script>");} else {throw new RuntimeException("文件上传失败!");}}/*** 将文件信息存储到Excel文件中** @param filename 文件名称* @param filepath 文件路径*/private void storeFileInfoToExcel(String filename, String filepath) {try {File file = new File(ResourceUtils.getURL("classpath:").getPath() + "/static/file_info.xlsx");XSSFWorkbook excel;XSSFSheet sheet;FileOutputStream out;// 如果文件存在,则读取已有数据if (file.exists()) {FileInputStream fis = new FileInputStream(file);excel = new XSSFWorkbook(fis);sheet = excel.getSheetAt(0);fis.close();} else {// 如果文件不存在,则创建一个新的工作簿和工作表excel = new XSSFWorkbook();sheet = excel.createSheet("file_info");// 创建表头XSSFRow headerRow = sheet.createRow(0);headerRow.createCell(0).setCellValue("文件名称");headerRow.createCell(1).setCellValue("文件路径");}// 获取下一个行号int rowNum = sheet.getLastRowNum() + 1;// 创建新行XSSFRow newRow = sheet.createRow(rowNum);newRow.createCell(0).setCellValue(filename);newRow.createCell(1).setCellValue(filepath);// 将数据写入到文件out = new FileOutputStream(file);excel.write(out);// 关闭资源out.close();excel.close();} catch (IOException e) {throw new RuntimeException(e);}}
}

4.编写认证回调接口类

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class RedirectController {/*** 回调地址* http://localhost:8080/redirectUri?code=M.C105_BL2.2.127d6530-7077-3bcd-081e-49be3abc3b45** @param code* @return*/@GetMapping("/redirectUri")public String redirectUri(String code) {return code;}
}

5.编写application.properties配置文件

# 应用服务 WEB 访问端口
server.port=8080
#OneDrive的ACCESS_TOKEN
onedrive.access-token=你的ACCESS_TOKEN

6.编写启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class OneDriveUploadApplication {public static void main(String[] args) {SpringApplication.run(OneDriveUploadApplication.class, args);}}

7.编写上传页面,放在resources的static目录中

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>文件上传</title>
</head>
<body>
<div align="center"><h1>文件上传</h1><form action="upload" method="post" enctype="multipart/form-data"><input type="file" name="file"><br><br><input type="submit" value="提交"></form>
</div>
</body>
</html>

8.启动项目,访问http://localhost:8080/进行测试

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

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

相关文章

MQL5语言键盘快捷键交易代码实现

文章目录 一、输入变量与全局变量二、初始化函数设置三、事件函数设置 一、输入变量与全局变量 //--- input parameters input double InpLots 0.1; /* Lots */ // Requested volume input int InpMagic 1024; /* Magic…

JAVA学习-集合.使用Properties

Properties是Java集合框架中的一种特殊的Map实现类&#xff0c;它用于处理键值对的配置文件。下面是Properties的特点和使用方法的概述&#xff0c;以及附上示例代码和说明。 一、特点&#xff1a; 1. Properties继承自Hashtable类&#xff0c;因此它是基于哈希表实现的。 2. …

《汇编语言》- 读书笔记 - 实验9 根据材料编程

《汇编语言》- 读书笔记 - 实验9 根据材料编程 需求所需的相关知识属性字节每一位的含义 分析字符位置属性 解答思路代码 效果 需求 在屏幕中间分别显示 绿色、绿底红色、白底蓝色 的字符串 welcome to masm!。 所需的相关知识 80x25 彩色字符模式显示缓冲区(以下简称为显示…

关于DVWA靶场Could not connect to the database service的几种解决办法

总的来说这个问题都是 config 配置文件没有修改正确 一般修改数据库的用户名和密码与 phpstudy 一致并且添加了 key 就能初始化成功的 但是我还遇到过另一种情况&#xff0c;修改了上面的东西依旧无法连接到数据库 Could not connect to the database service. Please check …

什么是NAT网关?联通云NAT网关有什么优势

在当今云计算时代&#xff0c;网络安全和连接性是企业发展的关键因素之一。NAT网关&#xff08;Network Address Translation Gateway&#xff09;是一种网络设备&#xff0c;它可以在私有网络和公共网络之间进行地址转换&#xff0c;从而使得内部网络中的设备能够与外部网络进…

如果马斯克投资OpenAI,而不是收购推特会如何?

从去年年底开始&#xff0c;AIGC就开始快速流行&#xff0c;生成式人工智能技术的不断演变&#xff0c;以OpenAI受到微软的追投开始&#xff0c;再以ChatGPT的发布快速在互联网市场蔓延为标志性事件&#xff0c;进而开始引领了一场新兴人工智能的快速发展之路。 去年&#xff…

DPDK系列之四十一数据收发整体流程源码分析之二流程框架

一、基本说明 本篇接着分析流程的源码&#xff0c;在收发数据前的基础准备。包括端口的初始化、配置等&#xff0c;当一切基础的准备完成后&#xff0c;工作状态也已经就绪&#xff0c;则可以开始工作了。端口的处理是启动程序前的一个开始环节。 在这个示例中&#xff0c;主要…

Javaweb之SpringBootWeb案例之AOP通知类型的详细解析

3.1 通知类型 在入门程序当中&#xff0c;我们已经使用了一种功能最为强大的通知类型&#xff1a;Around环绕通知。 Around("execution(* com.itheima.service.*.*(..))") public Object recordTime(ProceedingJoinPoint pjp) throws Throwable {//记录方法执行开始…

第13讲我创建的投票列表实现

新建我创建的投票页面 {"path": "pages/createVoteList/createVoteList","style": {"navigationBarTitleText": "我创建的投票"}}个人中心页面&#xff0c;加下 点击 “我创建的投票”跳转列表页面 goVoteList:function(){u…

ROS目标跟随(路径规划、slam、定位、雷达)——接上文,改善跟随的位置

确保进行跟随的小车始终在身后 最终效果代码改进 最终效果 ROS目标跟随改进版 代码改进 这里给出上一篇博客的链接&#xff1a;https://blog.csdn.net/m0_71523511/article/details/135610191 使用上一篇的launch文件创建机器人时&#xff0c;ros会自动创建一个坐标系相对关系…

阿里云服务器租用价格2024年新版活动报价和租用收费标准

2024年最新阿里云服务器租用费用优惠价格表&#xff0c;轻量2核2G3M带宽轻量服务器一年61元&#xff0c;折合5元1个月&#xff0c;新老用户同享99元一年服务器&#xff0c;2核4G5M服务器ECS优惠价199元一年&#xff0c;2核4G4M轻量服务器165元一年&#xff0c;2核4G服务器30元3…

《剑指Offer》笔记题解思路技巧优化 Java版本——新版leetcode_Part_3

《剑指Offer》笔记&题解&思路&技巧&优化_Part_3 &#x1f60d;&#x1f60d;&#x1f60d; 相知&#x1f64c;&#x1f64c;&#x1f64c; 相识&#x1f622;&#x1f622;&#x1f622; 开始刷题1. LCR 138. 有效数字——表示数值的字符串2. LCR 139. 训练计划…

MATLAB导出图程序

本文将以代码的形式快速介绍MATLAB导出图到Paper 1 从simulation导出数 2 与simulation同源文件夹下创建导图m文件 代码如下&#xff1a; % 实验后的数据处理用 M-文件 % clear all % 清空工作空间 % close all      % 关闭所有图形窗口 % load adp.mat …

算法中关于数学的题目练习

算法中关于数学的题目练习 1、买不到的数目题目信息思路题解 2、蚂蚁感冒题目信息思路题解 3、饮料换购题目信息思路题解 1、买不到的数目 题目信息 思路 数学结论&#xff08;证明略&#xff09;&#xff1a; p、q为正整数且互质&#xff0c;不能由p、q凑出来的最大的数为(p…

java生态环境评价Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java 生态环境评价管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysq…

RK3399平台开发系列讲解(USB篇)USB控制传输方式介绍

🚀返回专栏总目录 文章目录 一、控制传输详解二、Setup阶段和Data阶段三、Setup 事务格式沉淀、分享、成长,让自己和他人都能有所收获!😄 📢USB控制传输是USB通信中的一种基本传输类型,用于控制USB设备的配置和操作。它由 Setup 阶段和 Data 阶段组成,可用于发送命令…

SIFT 2D/3D检测原理

一、SIFT 2D 二、SIFT 3D SIFT 3D关键点检测以及SAC-IA粗配准-CSDN博客

轻资产上班族副业,steam搬砖项目新手1周出结果

作为一个80后社畜&#xff0c;我打从上大学就喜欢倒腾各种赚钱的事情&#xff0c;不管操作网络上还是现实中的任何项目我都会亲自去摸索其中的赚钱原理&#xff0c;实践才能出真知。steam搬砖项目是我实操了3年多的项目&#xff0c;这个steam搬砖项目长期稳定又老牌阳光&#x…

12.18 校招 实习 内推 面经

绿*泡*泡VX&#xff1a; neituijunsir 交流裙 &#xff0c;内推/实习/校招汇总表格 1、实习&校招 | 寒序科技 2024实习/校招/合伙人招募启动 实习&校招 | 寒序科技 2024实习/校招/合伙人招募启动 2、校招 | 北京海纳川汽车部件2024届校园招聘火热进行中 校招 | 北…

突破编程_C++_面试(高级特性(2))

面试题8&#xff1a;什么是线程局部存储的技术 线程局部存储&#xff08;Thread Local Storage&#xff0c;TLS&#xff09;是一种存储变量的方法&#xff0c;这些变量在其所在的线程内是全局可访问的&#xff0c;但不能被其他线程访问&#xff0c;从而实现了变量的线程独立性…