如何通过 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>
相关推荐
练习时长两年半的Java练习生(升级中)3 小时前
从0开始学习Java+AI知识点总结-30.前端web开发(JS+Vue+Ajax)
前端·javascript·vue.js·学习·web
vipbic3 小时前
关于Vue打包的遇到模板引擎解析的引号问题
前端·webpack
qq_510351593 小时前
vw 和 clamp()
前端·css·html
良木林3 小时前
JS中正则表达式的运用
前端·javascript·正则表达式
JosieBook4 小时前
【SpringBoot】21-Spring Boot中Web页面抽取公共页面的完整实践
前端·spring boot·python
SY_FC5 小时前
uniapp阿里云验证码使用
阿里云·uni-app·notepad++
吃饭睡觉打豆豆嘛5 小时前
深入剖析 Promise 实现:从原理到手写完整实现
前端·javascript
前端端5 小时前
claude code 原理分析
前端
GalaxyMeteor5 小时前
Elpis 开发框架搭建第二期 - Webpack5 实现工程化建设
前端