php 适用于NextCloud的Webdav API(带Guzzle)

5kgi1eie  于 2023-02-03  发布在  PHP
关注(0)|答案(1)|浏览(215)

我尝试通过Webdav API(文档)上传一个字符串(html)到我的NextCloud。我使用了多部分文件上传,因为我读到这是实现文件上传到API的正常方式。当我上传一个文件时,它正确地创建了它,我上传通过,但它总是添加以下内容到文件:

----------------------------371289179749834008757921
Content-Disposition: form-data; name="data"

Hello world
----------------------------371289179749834008757921--

我只想把"Hello world"部分放到文件中。这是我用来把字符串作为文件上传的代码:

function sendToNextCloud(string $fileName, string $content)
    {
        $client = new Client();
        $headers = [
            'Authorization' => 'Basic Password',
        ];

        $options = [
            'multipart' => [
                [
                    'name' => 'file',
                    'contents' => $content,
                    'filename' => $fileName,
                    'headers' => [
                        'Content-Type' => 'multipart/form-data'
                    ]
                ]
            ]];

        $request = new \GuzzleHttp\Psr7\Request('PUT', 'nextcloud:8080/remote.php/webdav/' . $fileName, $headers);
        dump($request, $options);
        $res = $client->sendAsync($request, $options)->wait();
        dump($res->getBody()->getContents());
        if ($res->getStatusCode() == 201) {
            dump('Successfully sent');
        }
        return "test";
    }

我是否需要更改多部分标题中的内容类型、设置不同的选项或使用不同的上传方式?
谢谢你的帮助。

tjjdgumg

tjjdgumg1#

我找到了解决问题的办法:

use GuzzleHttp\Client;

$client = new Client();
$url = "https://webdav.example.com/file.txt";
$headers = [
    'Content-Type' => 'text/plain',
    'Authorization' => 'Basic ' . base64_encode('username:password')
];
$contents = "This is the contents of the file";

$response = $client->put($url, [
    'headers' => $headers,
    'body' => $contents
]);

if ($response->getStatusCode() == 201) {
    echo "File uploaded successfully";
} else {
    echo "Failed to upload file";
}

这将从一个简单的字符串创建一个文件,而不使用multipart,只使用一个简单的PUT方法。

相关问题