2011-07-18 30 views
1

我嘗試使用下面的代碼流通過PHP的使用IPCAMERA的ReadFile()以流網絡攝像頭;400錯誤的請求 - 試圖在外部URL

<? 
# Stop apache timing out 
set_time_limit(0); 

# Set the correct header 
header('Content-Type: multipart/x-mixed-replace;boundary=ipcamera'); 

# Read the images 
readfile('http://[USER]:[PASSWORD]@[IPADDRESS]:[PORT]/videostream.cgi'); 
?> 

這個腳本在運行Apache和PHP我的本地主機就好了,但是我的Web服務器上(2個服務器測試),我收到一個400錯誤請求錯誤。我以前收到'連接被拒絕'的錯誤,但這是通過我的主機轉發正確的端口來解決的。

是400不是一些不正確的語法?這可能是因爲我有「[用戶]:[PASSWORD] @」在網址中?如果是這樣,是否有另一種方式可以在運行readfile之前進行身份驗證?

我已經運行在下列情況下確定的響應的代碼;

readfile('http://[USER]:[PASSWORD]@[IPADDRESS]:[PORT]/NONEXISTINGFILE.cgi'); 
// Returns 400 Bad Request (Should be 404) 

readfile('http://[IPADDRESS]:[PORT]/NONEXISTINGFILE.cgi'); 
// Returns 404 Not Found (Correct Response) 

readfile('http://[IPADDRESS]:[PORT]/videostream.cgi'); 
// Returns 401 Unauthorized (Correct Response) 

readfile('http://[USER]:[PASSWORD]@[IPADDRESS]:[PORT]/videostream.cgi'); 
// Returns 400 Bad Request (Incorrect - Should be .. 200(?) OK) 

readfile('http://[USER]:[PASSWORD]@[IPADDRESS]:[PORT]/FILETHATDOESEXIST.jpg'); 
// Returns 400 Bad Request (Should be 200(?) OK) 

readfile('http://[IPADDRESS]:[PORT]/FILETHATDOESEXIST.jpg'); 
// Returns 200(?) OK (Correct Response) 

如果有人能夠給我這個腳本的捲曲等效物,也許這是解決方案。賞金仍然站立的人誰可以解決這個對我來說:)

問候,

+0

** 400 **請求不能被服務器由於語法錯誤理解。 – sdolgy

+0

我明白這個錯誤,只是不知道如何阻止它:P – Joel

+0

如果您嘗試訪問除videostream.cgi以外的任何內容會發生什麼?對於非現有文件,你會得到正常的404錯誤嗎?可以正常下載的文件的工作? – Johan

回答

0

簡單地檢查你的[USER][PASSWORD] ...確保它不包含:, /, @ ...

如果有與\

+0

謝謝,根據第一篇文章的評論,用戶名和密碼都是100%小寫字母數字字符。 – Joel

+0

好吧,我的壞,它應該返回401錯誤,如果用戶名/密碼包含非法字符,而不是錯誤400 – ajreal

0

逃避它,您可能有一些在被禁用的ReadFile的加載外部URL的能力在生產服務器上你的php.ini設置。

我特別想到allow_url_fopen它可能被設置爲FALSE,雖然它可能是別的。

你也可以檢查你的web服務器的錯誤日誌中的線索。 PHP通常會發出特定的警告。

+0

allow_url_fopen是ON。如果不是,我會收到php錯誤,而不是正確的404s e.t.c. – Joel

2

對於捲曲,你可以試試:

<?php 

# Stop apache timing out 
set_time_limit(0); 

# Set the correct header 
header('Content-Type: multipart/x-mixed-replace;boundary=ipcamera'); 

# Read the images 
$ch = curl_init('http://[IPADDRESS]:[PORT]/videostream.cgi'); 
curl_setopt($ch, CURLOPT_USERPWD, '[USER]:[PASSWORD]'); 
curl_exec($ch); 

如果你想繼續使用ReadFile的(),你可以使用 stream_context_create()來構建的ReadFile流上下文。請參閱this documentation on php.net以瞭解如何完成此操作 - 具體而言,您需要創建一個通過Authentication標頭的HTTP流上下文。

+0

這確實工作得很好。我只想避免由於readfile的簡單性而導致捲曲,並且因爲我見過很多人最近批評curl。謝謝! :) P.S.我確實看了一下stream_context_create的東西,但是看起來像比這樣做更多的開銷。 – Joel

+1

我覺得readfile()*真正*擅長在本地文件系統的東西。如果你的HTTP請求真的很簡單,它可以在那裏工作,但在這種情況下,你的需求會超出簡單的範圍,所以你將不得不採用更靈活的方法。無論哪種方式,都樂於提供幫助。 :) – TML

+0

你可能會給我建議/例如如何將其輸出到圖像文件。問題在於網絡攝像機只允許一定數量的連接,並且每次有人在此刻查看圖像時,php顯然會創建一個新的連接。謝謝 – Joel