2011-06-13 95 views
0

我正在嘗試使用處理程序來提供我的Web目錄之外的文件,並且出現了一些問題。我想在處理程序中執行檢查,並且需要能夠運行查詢,但只要我添加一行代碼而不是顯示的代碼,就會得到錯誤圖像「http:// localhost/xampp/site_name/image_handler.php?ID = d5xa24tdufoseg868r66yjz5sr19u41i「無法顯示,因爲它包含錯誤。在Firefox中我檢查了螢火蟲控制檯,它說圖像損壞或截斷。但是,如果我離開基本代碼,我已經顯示它只是服務於圖像。任何人都知道爲什麼會這樣?網絡目錄之外的文件已損壞或被截斷

編輯:顯示所有代碼

<?php 
include("roc/include/connection.php"); 
$db = new PDOConnectionFactory(); 
$conn = $db->getConnection(); 

//prepare for utf8 characters 
$sql = 'SET NAMES utf8'; 
$stmt = $conn->prepare($sql); 
$result=$stmt->execute(); 

$sql = 'SET CHARACTER SET utf8'; 
$stmt = $conn->prepare($sql); 
$result=$stmt->execute(); 
//************************** 

if (! preg_match("/^[[email protected],'s]*$/i",$_GET['ID'])) 

{ 

die('No illegal characters'); 

} 

else 

$empty=strlen($_GET['ID']); 

if ($empty==0) 

{ 

die('The text field cannot be empty'); 

} 

else 

{ 

$ID = $_GET['ID']; 



if (strlen($_GET['ID'])>35){ 
exit("error"); 
} 

} 


$sql="SELECT file_name FROM video WHERE vid_id=?"; 
$stmt=$conn->prepare($sql); 
$result=$stmt->execute(array($ID)); 

while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ 
$file_name = $row['file_name']."[img-004].jpg"; 
} 

echo $path="/home/g/Desktop/processed/".$file_name.""; 


//check if image is readible and type 
if (is_readable($path)) { 

header('Content-Length: '.filesize($path)); // provide file size 

header("Expires: -1"); 

header('Content-Type: image/jpeg'); 
$content=file_get_contents('/home/g/Desktop/processed/986861d331e8b4b4eacee5cb7aed494a[img-004].jpg'); 


} 
else { 
error_log("Can't serve image: $file_name"); 
} 

?> 

HTML輸出

<img src="http://localhost/xampp/site_name/image_handler.php?ID=d5xa24tdufoseg868r66yjz5sr19u41i" alt="The image 「http://localhost/xampp/site_name/image_handler.php?ID=d5xa24tdufoseg868r66yjz5sr19u41i」 cannot be displayed because it contains errors."> 
+1

所以...你說的是,正確的代碼正常工作,錯誤的代碼工作是錯誤的? – 2011-06-13 05:31:33

+0

沒有我說的這段代碼可以工作,但我需要檢查friggin。我需要能夠運行查詢並擁有比這個好友更多的代碼。這個腳本沒用。來吧... – Scarface 2011-06-13 05:32:47

+0

這段代碼很好。問題在於其餘部分。 – 2011-06-13 05:42:06

回答

1

如果你在發送標題之前做了echo "test" ......事情就會出錯。

如果您發送echo "test",並且您的標題表示您正在發送圖片......事情就會出錯。

代碼正在工作。

+0

我停止了回聲並調整了標題,現在事情已經好了...... – Scarface 2011-06-13 05:58:39

+0

@Scarface,如預期的那樣。這只是你的頭上不好! ;) – Frankie 2011-06-13 05:59:28

+1

哈哈是的,你說得對。至少我學到了一些東西。 – Scarface 2011-06-13 06:04:42

1

如果添加任何額外的數據,以圖像數據圖像會得到腐敗。如果您要輸出圖像,最好不要回顯圖像以外的任何其他圖像。唯一的辦法可能是寫任何你想寫在圖像上。你可以使用GD功能來做到這一點。還有另外一種我可能不建議的方式,你可以添加你喜歡的任何東西來結束圖像而不會出現錯誤。但那不能保證。 PS:除了在屏幕上回顯外,你仍然可以運行更多的代碼。

+0

我甚至不能運行mysql查詢。如何在不影響圖像數據的情況下運行我的處理程序的其餘部分? – Scarface 2011-06-13 05:41:00

+1

@scarface:您可能有錯誤或嘗試在屏幕上寫東西的東西。首先刪除echo $ content;部分並在瀏覽器頁面中加載文件。這應該給你一些信息。同時也要確保你以<?php開頭並以?>結束?>標籤外沒有空格。 – 2011-06-13 05:47:16

+0

謝謝傑姆,非常感謝。 – Scarface 2011-06-13 05:59:13

1

我不知道你要添加的代碼來做你的'檢查',但根據手冊:請記住,必須在發送任何實際輸出之前調用header(),或者通過普通的HTML標記,空行 在文件中,或從PHP。

也許你會關閉putting that image in a buffer更好:

<?php 
    // Code that checks out whatever .. 

    // more checks 
    ob_start(); 
    myClass::renderPng(); //header("Content-Type: image/png"); in here 
    $pngString = ob_get_contents(); 
    ob_end_clean(); 
?> 
+0

謝謝stefgosselin。 – Scarface 2011-06-13 06:03:00

0

你想幹什麼你的腳本輸出,如果有錯誤? HTML?一個特殊的錯誤圖像?

<?php 
$content = readfile('/home/g/Desktop/processed/986861d331e8b4b4eacee5cb7aed494a[img-004].jpg'); 

// Did readfile succeed? 

// Do db query. 

// Do some other checks. 

// Now output something to browser. 
if ($are_we_okay == true) { 
    header("Content-type: image/jpeg"); 
    echo $content; 
} else { 
    header("Content-type: text/html"); 
    echo "<b>Failed!</b>"; 
} 
?> 
+0

不,我剛剛嘗試輸出圖像時出現錯誤,但現在已修復。 – Scarface 2011-06-13 06:00:09