【问题标题】:PHP WebDAV server unable to perform PUT method using WindowsPHP WebDAV 服务器无法使用 Windows 执行 PUT 方法
【发布时间】:2012-08-23 13:57:37
【问题描述】:

我正在尝试实现一个基于 PHP 的 WebDAV 服务器,以便能够在 OS Windows(更准确地说是 Windows 7)下使用它。

一切正常,除了 PUT 方法。当我尝试将文件从文件系统上传到 WebDAV 服务器时,请求内容长度为空,这意味着我无法读取要放入服务器的文件。

这是我使用 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 中进行设置以使其正常工作,或者只是我的代码缺少某些东西?

【问题讨论】:

    标签: php windows-7 webdav


    【解决方案1】:

    Windows 将首先创建一个 0 字节文件。成功后,它将上传整个文件。

    【讨论】:

    • 按照您的指示,我能够使服务器在第一个 PUT 上成功。这之后是 PROPFIND,然后是第二个 PUT。只是,它的 content:length 也是空的。我不知道为什么以及如何使它工作......
    • 我是这个项目的作者:code.google.com/p/sabredav这个项目应该可以工作。我建议尝试一下,看看 Windows 来回发送什么,并尝试进行逆向工程。我已经有好几年的时间与各种客户一起修复奇怪的错误了;)
    • 再次感谢您的回答。我过去尝试过 SabreDAV,和其他人一样遇到同样的问题。第二个 PUT 在 windows 客户端下带有 content_length = 0。我尝试过的所有其他客户端(我尝试过 5 个)都可以工作,并且 content_length 等于文件大小。还有其他建议吗?
    • 我解决了。 Windows WebClient(或至少 Windows7 之一)在未禁用锁定时阻止文件 PUT。对于那些有同样问题的人,只需打开 regedit.exe 并转到并在“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\WebClient\Parameters”中禁用 SupportLocking(值必须为 0)。这样,第一个 PUT 将导致空(CONTENT_LENGTH = 0),但第二个将具有您在服务器上上传的文件的文件大小。
    猜你喜欢
    • 2012-02-16
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 2019-01-28
    • 2019-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多