2012-08-23 40 views
0

我想實現一個基於PHP的WebDAV服務器,以便能夠在操作系統Windows(更確切的說是Windows 7)下使用它。PHP WebDAV服務器無法使用Windows執行PUT方法

除PUT方法外,一切正常。當我嘗試將文件從文件系統上傳到WebDAV服務器時,請求內容長度爲空,這意味着我無法讀取要放入服務器的文件。

下面是當我拖動文件(簡單的.txt文件)使用Windows什麼我receiveng:

[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 

內容長度字段改變,該文件是我應該是在服務器上的在線。 我會在這裏發佈我的代碼片段:

$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中設置使其工作,或者它只是我的代碼缺乏什麼?

回答

0

Windows將首先創建一個0字節的文件。成功後,它將上傳整個文件。

+0

追隨你的領導,我能夠讓服務器在第一個PUT上成功。然後是PROPFIND,然後是第二個PUT。只有它的內容:長度也是空的。我找不出爲什麼以及如何使它工作... – MarcoR

+0

我是這個項目的作者:http://code.google.com/p/sabredav/這個項目應該工作。我會建議嘗試一下,看看哪些窗口來回發送,並嘗試進行反向工程。我有幾年的時間修復與在那裏的各種客戶奇怪的錯誤;​​) – Evert

+0

再次感謝您的答案。我過去嘗試過SabreDAV,與其他人一樣有同樣的問題。第二個PUT在windows客戶端下帶有一個content_length = 0。我嘗試過的所有其他客戶端(我嘗試了5次)並且content_length等於文件大小。 其他建議? – MarcoR

相關問題