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

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

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

找到接口 https://gitee.com/api/v5/repos/{owner}/{repo}/contents/{path}![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/20d22f0dfd5247ea86d59101cb17ad24.png)

填写基本信息 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 = null
        this.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) return
      
      this.uploading = true
      this.uploadedCount = 0
      this.uploadError = null
      this.uploadSuccess = false
      
      try {
        for (const file of this.selectedFiles) {
          await this.uploadSingleFile(file)
          this.uploadedCount++
        }
        
        this.uploadSuccess = true
        uni.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 = reject
            reader.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>
相关推荐
mldong1 分钟前
保姆级教程!手把手教你搭建FastAPI + Vue3前后端分离项目
vue.js·python·全栈
Mintopia6 分钟前
🚀 Cesium-Kit:10 秒为你的 Cesium 项目添加动态光效标记
前端·javascript·cesium
Mintopia8 分钟前
🌩️ 云边协同架构下的 WebAI 动态资源调度技术
前端·javascript·aigc
Olrookie9 分钟前
若依前后端分离版学习笔记(十六)——scoped、路由跳转
前端·笔记
qaqxiaolei10 分钟前
高效办公利器:前端实现表格导出excel格式 + 自定义水印的完整方案
前端·javascript
叫我詹躲躲12 分钟前
为什么Bun.js能在3秒内启动一个完整的Web应用?
前端·javascript·bun
辛宝Otto_WebWorker12 分钟前
自力更生!uniapp 使用鸿蒙 UTS 使用三方依赖、本地依赖
uni-app·harmonyos
Olrookie13 分钟前
若依前后端分离版学习笔记(十七)——ruoyi开发规范&流程,请求流程,依赖引入,组件注册&通信
前端·笔记
Keepreal49614 分钟前
谈谈对闭包的理解以及常见用法
前端·javascript
luckymiaow15 分钟前
告别环境配置地狱!UniApp Android 本地 一键打包神器
前端