PHP WebDAV服务器无法使用Windows执行PUT方法
我正在尝试实现一个基于PHP的WebDAV服务器,以便能够在OS Windows(更准确地说是Windows 7)下使用它 除了PUT方法外,其他方法都可以正常工作。当我尝试从文件系统上传文件到WebDAV服务器时,请求内容长度为空,这意味着我无法读取要放入服务器的文件 以下是我使用Windows拖动文件(simple.txt文件)时收到的信息:PHP WebDAV服务器无法使用Windows执行PUT方法,php,windows-7,webdav,Php,Windows 7,Webdav,我正在尝试实现一个基于PHP的WebDAV服务器,以便能够在OS Windows(更准确地说是Windows 7)下使用它 除了PUT方法外,其他方法都可以正常工作。当我尝试从文件系统上传文件到WebDAV服务器时,请求内容长度为空,这意味着我无法读取要放入服务器的文件 以下是我使用Windows拖动文件(simple.txt文件)时收到的信息: [HTTP_USER_AGENT] => Microsoft-WebDAV-MiniRedir/6.1.7601 [HTTP_TRANSLATE
[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客户端上载同一文件时,我得到了有效的响应,文件正在上载。以下是我使用CyberDuck客户端得到的结果:
[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
内容长度字段已更改,文件在服务器上处于联机状态。
我将在这里发布我的代码片段:
$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中有什么东西可以让它工作吗?还是只是我的代码缺少什么东西?Windows将首先创建一个0字节的文件。此操作成功后,它将上载整个文件。根据您的指导,我能够使服务器在第一次放置时成功。这之后是一个PROPFIND,然后是第二个PUT。只是,它的内容:length也是空的。我不知道为什么以及如何让它工作……我是这个项目的作者:这个项目应该工作。我建议尝试一下,看看windows来回发送什么,然后尝试反向工程。我有好几年的时间与各种各样的客户一起修复奇怪的bug;)再次感谢你的回答。我过去试过SabreDAV,和其他人有同样的问题。第二个PUT在windows客户端下具有content_length=0。我尝试的所有其他客户端(我尝试了5个)都可以工作,并且内容长度等于文件大小。还有其他建议吗?我解决了。未禁用锁定时,Windows WebClient(或至少Windows7-one)会阻止文件放入。对于有相同问题的用户,只需打开regedit.exe并转到“HKEY\U LOCAL\U MACHINE\SYSTEM\CurrentControlSet\services\WebClient\Parameters”并在其中禁用SupportLocking(值必须为0)。这样,第一个PUT结果将为空(CONTENT_LENGTH=0),但第二个PUT将具有您正在服务器上上载的文件的文件大小。