首页 > 解决方案 > 如何通过 API 将 Mp3 文件提交到 Gitlab 中的文件夹

问题描述

我正在尝试通过 API 将文件提交到 Gitlab。

该代码已经工作了 6 个月以上,但现在已经停止工作,代码中没有任何变化。该文件已提交到 Gitlab,但已损坏。

我浏览了 Guzzle 文档,一切看起来都是正确的,我对 Gitlab 关于提交的文档也做了同样的事情。

我现在使用 Laravel Illuminate/Http 类来发送提交,但同样的事情仍在发生。我能够提交到 Gitlab,但文件格式不正确。

$response = Http::withHeaders([
    'PRIVATE-TOKEN' => $gitlab_token,
])
    ->post('https://gitlab.com/api/v4/projects/.../repository/commits/', [
        'branch' => 'test-branch',
        'commit_message' => 'Updated audio file test.mp3',
        'actions' => array(array(
            'action' => 'update',
            'file_path' => 'filePath/../.mp3',
            'content' => base64_encode($var)
        )),
    ]);

如果我不将文件的内容编码为 base 64,则会收到错误消息:

格式错误的 UTF-8 字符,可能在文件中编码不正确

API 端是否有任何更改影响了如何处理文件以进行提交?有没有其他人找到解决方案?

标签: phplaravelguzzlegitlab-api

解决方案


我认为你有两个问题;首先没有指定内容类型。发布请求将multipart/form-data与文件附件一样发送,也可以不发送application/x-www-url-encoded。此 API 需要 JSON 数据。

其次, commit端点中有一个参数来指定文件编码。它默认为“文本”,但您发送的是 base64 编码的文件。

我对 Gitlab API 不够熟悉可以肯定地说,但你的file_path属性看起来也很奇怪;不应该只是将“.mp3”放入该目录吗?

尝试这个:

$response = Http::withHeaders([
    'PRIVATE-TOKEN' => $gitlab_token,
    'Content-Type' => 'application/json',
])
    ->post('https://gitlab.com/api/v4/projects/.../repository/commits/', [
        'branch' => 'test-branch',
        'commit_message' => 'Updated audio file test.mp3',
        'actions' => [
            [
                'action' => 'update',
                'file_path' => '.mp3',
                'content' => base64_encode($var),
                'encoding' => 'base64',
            ]
        ],
    ]);

推荐阅读