0

OS Windows(より正確にはWindows 7)で使用できるように、PHPベースのWebDAVサーバーを実装しようとしています。

PUT メソッドを除いて、すべてが正常に機能します。ファイルシステムから WebDAV サーバーにファイルをアップロードしようとすると、リクエストの content-length が空になり、サーバーに入れたいファイルを読み取れません。

Windows を使用してファイル (単純な .txt ファイル) をドラッグすると、次のようなメッセージが表示されます。

[HTTP_USER_AGENT] => Microsoft-WebDAV-MiniRedir/6.1.7601
[HTTP_TRANSLATE] => f
[CONTENT_LENGTH] => 0
[HTTP_VIA] => 1.1 squid.Sole:3128 (squid/2.7.STABLE9), 1.0 squidcache.Proxy6.CCSP:3129 (squid/2.6.STABLE24)
[PATH] => /bin:/usr/bin:/sbin:/usr/sbin
[SERVER_SOFTWARE] => Apache
[SERVER_PORT] => 80
[GATEWAY_INTERFACE] => CGI/1.1
[SERVER_PROTOCOL] => HTTP/1.0
[REQUEST_METHOD] => PUT

専用の webdav クライアントを使用して同じファイルをアップロードすると、有効な応答が返され、ファイルがアップロードされます。以下は、Cyber​​Duck クライアントを使用して取得したものです。

[HTTP_EXPECT] => 100-continue
[CONTENT_LENGTH] => 263
[CONTENT_TYPE] => text/plain
[HTTP_CONNECTION] => Keep-Alive
[HTTP_USER_AGENT] => Cyberduck/4.2.1 (9350) (Windows 7/6.1) (x86)
[HTTP_ACCEPT_ENCODING] => gzip,deflate
[PATH] => /bin:/usr/bin:/sbin:/usr/sbin
[SERVER_SOFTWARE] => Apache
[SERVER_PORT] => 80
[GATEWAY_INTERFACE] => CGI/1.1
[SERVER_PROTOCOL] => HTTP/1.1
[REQUEST_METHOD] => PUT

CONTENT-LENGTH フィールドが変更され、ファイルはサーバー上でオンラインになっているはずです。ここにコードフラグメントを投稿します:

$options = Array();
$options["path"] = $this->path;
$options["content_length"] = $_SERVER["CONTENT_LENGTH"];
$options["stream"] = fopen('php://input', 'r');

$stat = $this->PUT($options); // In the PUT method I fopen the destination file in "w"

if ($stat === false) {
    $stat = "403 Forbidden";
} else if (is_resource($stat) && get_resource_type($stat) == "stream") {
    $stream = $stat;

    $stat = $options["new"] ? "201 Created" : "204 No Content";
    if (!empty($options["ranges"])) {
        if (0 == fseek($stream, $range[0]["start"], SEEK_SET)) {
            $length = $range[0]["end"]-$range[0]["start"]+1;
            if (!fwrite($stream, fread($options["stream"], $length))) {
                 $stat = "403 Forbidden"; 
            }
        } else {
            $stat = "403 Forbidden"; 
        }
    }else {
        while (!feof($options["stream"])) {
            if (false === fwrite($stream, fread($options["stream"], 4096))) { //The fread reads nothing from the stream...
                $stat = "403 Forbidden"; 
                break;
            }
         }
      }
    fclose($stream);    
}

この問題を解決するにはどうすればよいですか? それを機能させるためにWindowsに設定するものはありますか、それとも何かが欠けているのは私のコードですか?

4

1 に答える 1

0

Windowsは最初に0バイトのファイルを作成します。これが成功すると、ファイル全体がアップロードされます。

于 2012-08-31T00:31:27.607 に答える