通过PHP脚本将文件上传到Bitbucket

时间:2013-11-30 16:17:33

标签: php file-upload curl bitbucket

我尝试使用curl库通过PHP脚本将我的数据库上传到我的存储库的bitbucket下载部分。通常我会去我的phpmyadmin并将我的数据库导出到一个文件夹,然后转到我的存储库下载部分下的bitbucket帐户并手动上传。我需要一个自动完成这些任务的脚本。

我尝试使用像这样的curl库:

// bitbucket username and password
define('USERNAME', 'my_username');
define('PASSWORD', 'my_password');

$url = 'https://bbuseruploads.s3.amazonaws.com/';
//This needs to be the full path to the file you want to send.
$file_name_with_full_path = realpath('apache_pb2.gif');

$post = array('extra_info' => '123456', 'file_contents' => '@' . $file_name_with_full_path); // image file example here

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, USERNAME . ":" . PASSWORD);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
//curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
$resp = curl_exec($ch);

// validate CURL status
if (curl_errno($ch))
  throw new Exception(curl_error($ch), 500);

结果:

<error><code>InvalidArgument</code>
<message>Unsupported Authorization Type</message>
<argumentvalue>Basic hash_code_here</argumentvalue>
<argumentname>Authorization</argumentname>
<requestid>hash_code_here</requestid>
<hostid>hash_code_here</hostid>
</error>

如果您需要进一步说明,请告知我们。

2 个答案:

答案 0 :(得分:0)

仅在有人在这里找到这具老尸的情况下

我通过此功能解决了它:

 /**
 * Uploads a file to Bitbucket Download area of the configured repository
 * Does the same as thi bash command:
 * curl -X POST "https://USER:PW@api.bitbucket.org/2.0/repositories/owner/slug/downloads/" --form files=@"test.txt"
 * @param string $filename
 * @param string $apiEndpoint
 * @param string $apiUser
 * @param string $apiPassword
 * @return bool|string
 * @throws Deployer\Exception\Exception
 */
public static function sendFileToDownload(
    string $filename,
    string $apiEndpoint,
    string $apiUser,
    string $apiPassword
) {
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $apiEndpoint);
    curl_setopt($curl, CURLOPT_POST, 1);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLAUTH_BASIC, 1);
    curl_setopt($curl, CURLOPT_USERPWD, "$apiUser:$apiPassword");

    $data = [
        'files' => curl_file_create($filename),
    ];

    curl_setopt($curl, CURLOPT_POSTFIELDS, $data);

    $erg = curl_exec($curl);
    $status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
    if ($erg === false || $status > 300) {
        throw new Deployer\Exception\Exception("Result: ".print_r($erg, true), $status);
    }
    curl_close($curl);
  }
}

对我来说,最重要的一点是本节:

$data = [
    'files' => curl_file_create($filename),
];

这导致将本地文件上传到我的回购下载区,名称为$ filename(文件名路径)。

答案 1 :(得分:0)

今天也遇到了同样的问题。 API CURL请求的“不支持的授权类型”响应。

我花了很长时间咨询Google。最后,我发现我的URL在一起(偶然地)有两个斜杠。请参阅,我要连接的API有一个URL,然后是一个API端点。像这样:
https://www.example.com/api/v2/foo-或-
https://www.example.com/api/v2/bar

但是我不小心像这样将它们组合在一起:
curl_setopt($curl, CURLOPT_URL, $url ."/". $endpoint);
给出我的数据:
$url = "https://www.example.com/api/v2/"
$endpoint = "foo"

我最终得到了这个:
"https://www.example.com/api/v2//foo"

问题已解决,只需删除."/".并使其变为:.

奖金的可能性:在此过程中,我学到了一些有趣的东西,那就是API人士更喜欢在发布给他们的json数据周围加上双引号。我还没有验证这有什么用,但是我不是用单引号将双引号引起来(反之亦然),而是使用转义内部双引号的方式。并且正在工作。