当前位置: 首页 > backend >正文

如何通过 Gitee API 上传文件到指定仓库

如何通过 Gitee API 上传文件到指定仓库

在这里插入图片描述

首先,进入Gitee官方API文档:https://gitee.com/api/v5/swagger#/postV5ReposOwnerRepoContentsPath,找到仓库 --> 新建文件接口 -->点击申请授权

在这里插入图片描述

找到接口 https://gitee.com/api/v5/repos/{owner}/{repo}/contents/{path}在这里插入图片描述

填写基本信息 access_token,owner,repo,path,content,message,branch 等必要参数信息。

参数Value
access_token你自己申请的授权 key
owner用户名称
repo项目名称
path文件名称或者图片名称
content必须是base64的字符串
message随便写
branch分支名称

在这里插入图片描述

点击左下方【测试】按钮,查看是否成功

( 如果出现404 或者其他 就是没成功)

下方是测试成功的

在这里插入图片描述

代码逻辑

<template><view class="container"><button @click="chooseMedia">选择图片/视频</button><button @click="uploadToGitee" :disabled="!selectedFiles.length">上传到Gitee</button><view class="preview-container"><view v-for="(file, index) in selectedFiles" :key="index" class="preview-item"><image v-if="file.type === 'image'" :src="file.path" mode="aspectFit" class="preview-image"></image><video v-else-if="file.type === 'video'" :src="file.path" controls class="preview-video"></video><text class="file-name">{{ file.name }}</text></view></view><view v-if="uploading" class="upload-status">上传中... {{ uploadedCount }}/{{ selectedFiles.length }}</view><view v-if="uploadError" class="error-message">上传失败: {{ uploadError }}</view><view v-if="uploadSuccess" class="success-message">上传成功!</view></view>
</template><script>
export default {data() {return {selectedFiles: [],uploading: false,uploadedCount: 0,uploadError: null,uploadSuccess: false,// Gitee 配置 - 替换为你的实际信息giteeConfig: {owner: 'your-gitee-username',repo: 'your-repo-name',branch: 'master',token: 'your-gitee-access-token'}}},methods: {async chooseMedia() {try {const res = await uni.chooseMedia({count: 9,mediaType: ['image', 'video'],sourceType: ['album', 'camera'],maxDuration: 30,camera: 'back'})this.selectedFiles = res.tempFiles.map(file => ({path: file.tempFilePath,name: this.generateFileName(file.tempFilePath),type: file.fileType === 'image' ? 'image' : 'video',file: file}))this.uploadError = nullthis.uploadSuccess = false} catch (err) {uni.showToast({title: '选择文件失败',icon: 'none'})console.error(err)}},generateFileName(filePath) {const ext = filePath.split('.').pop()const timestamp = new Date().getTime()const random = Math.floor(Math.random() * 10000)return `file_${timestamp}_${random}.${ext}`},async uploadToGitee() {if (!this.selectedFiles.length) returnthis.uploading = truethis.uploadedCount = 0this.uploadError = nullthis.uploadSuccess = falsetry {for (const file of this.selectedFiles) {await this.uploadSingleFile(file)this.uploadedCount++}this.uploadSuccess = trueuni.showToast({title: '全部文件上传成功',icon: 'success'})} catch (err) {this.uploadError = err.message || '上传失败'uni.showToast({title: '上传失败',icon: 'none'})console.error(err)} finally {this.uploading = false}},async uploadSingleFile(file) {// 1. 读取文件内容const fileContent = await this.readFileAsBase64(file.path)// 2. 准备上传数据const uploadData = {access_token: this.giteeConfig.token,content: fileContent,message: `Upload ${file.name}`,branch: this.giteeConfig.branch}// 3. 调用 Gitee API 上传文件const response = await uni.request({url: `https://gitee.com/api/v5/repos/${this.giteeConfig.owner}/${this.giteeConfig.repo}/contents/${file.name}`,method: 'POST',data: uploadData,header: {'Content-Type': 'application/json;charset=UTF-8'}})if (response[1].statusCode !== 201) {throw new Error(response[1].data.message || '上传失败')}return response[1].data},readFileAsBase64(filePath) {return new Promise((resolve, reject) => {plus.io.resolveLocalFileSystemURL(filePath, entry => {entry.file(file => {const reader = new plus.io.FileReader()reader.onloadend = evt => {// 移除 data URL 前缀const base64 = evt.target.result.split(',')[1]resolve(base64)}reader.onerror = rejectreader.readAsDataURL(file)}, reject)}, reject)})}}
}
</script><style>
.container {padding: 20px;
}button {margin: 10px 0;padding: 10px;background-color: #007AFF;color: white;border-radius: 5px;
}button:disabled {background-color: #cccccc;
}.preview-container {margin-top: 20px;
}.preview-item {margin-bottom: 15px;border: 1px solid #eee;padding: 10px;border-radius: 5px;
}.preview-image {width: 100%;height: 200px;
}.preview-video {width: 100%;height: 200px;
}.file-name {display: block;margin-top: 5px;font-size: 12px;color: #666;
}.upload-status, .error-message, .success-message {margin-top: 10px;padding: 10px;border-radius: 5px;
}.upload-status {background-color: #f0f0f0;
}.error-message {background-color: #ffeeee;color: #ff0000;
}.success-message {background-color: #eeffee;color: #00aa00;
}
</style>
http://www.xdnf.cn/news/20189.html

相关文章:

  • go webrtc - 1 go基本概念
  • 鸿蒙Next的UI国际化与无障碍适老化实践:构建全球包容的数字世界
  • MySQL 综合练习
  • 【数据分享】上市公司数字化转型相关词频统计数据(2000-2024)
  • 解锁无限创意:Tldraw+cpolar如何通过内网穿透技术打破空间限制
  • 【leetcode】77.组合
  • DNS基本功能搭建
  • uni-app iOS 日志与崩溃分析全流程 多工具协作的实战指南
  • TCP/IP函数——sendmsg
  • 怎么获取Nano Banana的APK Key?
  • Dify基础应用
  • 1分钟了解等保测评流程
  • Kubernetes 全景指南:从核心概念到云原生未来
  • BYOFF(自定义格式函数)(79)
  • 如何安全地删除与重建 Elasticsearch 的 .watches 索引
  • 人工智能之数学基础:逻辑回归算法的概率密度函数与分布函数
  • 3个维度打造差异化内容,告别运营焦虑
  • 老年公寓管理系统设计与实现(代码+数据库+LW)
  • 从零开始学大模型之动手搭建大模型
  • LLM与数据工程的融合:衡石Data Agent的语义层与Agent框架设计
  • 自制扫地机器人 (五) Arduino 手机远程启停设计 —— 东方仙盟
  • 基于C#实现USB转串口读取扫描枪数据
  • 从重金挖角OpenAI/谷歌到招聘急刹车:Meta MSL主要人员梳理,半数华人+75%博士成主力
  • 沙堆状态的可视化图和雪崩分布
  • Day21_【机器学习—决策树(3)—剪枝】
  • java面试中经常会问到的zookeeper问题有哪些(基础版)
  • Vue3 频率范围输入失焦自动校验实现
  • Windows 11主机Ubuntu 24.04虚机共享目录权限问题
  • MySQL问题4
  • 阿里云服务器配置ssl-docker nginx