2015-04-16 26 views
1

我想實時存儲由php創建的圖像。目前,每個圖像在創建後都會被破壞,但我想將圖像存儲在我網站上的唯一文件夾中。如何通過php存儲轉儲信息

我見過很多使用專用轉儲文件夾的網站,例如http://www.example.com/dump/4592898349.jpg,我想知道是否有人可以向我解釋我該怎麼做。

這是我與啓動圖像生成形式的html代碼:

<html> 
    <body> 
     <form action="result.php" method="get"> 
      <input type="text" name="name" id="name"> 
      <input type="button" name="submit" id="submit"> 
     </form> 
    </body> 
</html> 

這裏是我的PHP代碼,創建與給定文本的圖像:

<?php 
    header('Content-type: image/jpeg'); 
    $jpg_image = imagecreatefromjpeg('Desert.jpg'); 
    $white = imagecolorallocate($jpg_image, 73, 41, 236); 
    $font_path = 'OpenSans-Italic.TTF'; 
    $text = $_GET['name'] ; 
    imagettftext($jpg_image, 25, 0, 75, 50, $white, $font_path, $text); 
    imagejpeg($jpg_image); 
    imagedestroy($jpg_image); 
?> 

然而,我仍然不知道哪裏是保存圖像的最佳地點。

+1

rtfm:http://php.net/imagejpeg,特別要注意其第二個(可選)參數... –

+0

請不要給這些鏈接,因爲我不明白我的理解與真實的工作示例 – learner

+7

那麼你不會在這個行業中走得很遠。要麼學會閱讀文件,要麼找到不同的職業。 –

回答

0

變化

imagejpeg($jpg_image); 

imagejpeg($jpg_image,"imagefolderpath/image.jpg"); 

需要寫入圖像文件,而不是輸出的圖像...所以...

$image_url="dump/".rawurlencode(trim($text)).".jpg"; 
imagejpeg($jpg_image,$image_url); 
readfile($image_url); 
+0

如果我想設置圖像名稱,我們從html輸入標記 – learner

+0

我想給圖像名稱從字符串'$ _GET ['name']' – learner

+0

是的,你有這條線'$ text = $ _GET ['name'];'你把它分配給$ text ....所以這是同樣的事情。我urlencoded它,因爲我認爲你想再次使用它的URL,對吧? – RightClick

1

所以,不爲了嚴格要求學習者,Marc B建議的解決方案更接近於imagejpeg()函數:

bool imagejpeg (resource $image [, string $filename [, int $quality ]]) 

因此,有第二個可選參數$filename,如果給出,它會告訴GD將圖像存儲在該文件中。

但是它也說,如果你傳遞一個文件名,圖像不會自動輸出到瀏覽器,因爲如果你不通過第二個參數就會發生這種情況。

因此,有三個步驟,你將必須做到:

  1. 創建唯一的文件名

  2. 保存圖像瀏覽器中的文件

  3. 顯示圖像

現在最簡單的解決方案是:

/* --- create unique filename --- */ 

// get name passed or set default, this will be prepended to 
// the unique filename to make it more readable 
$prepend_filename = (isset($_GET['name']) ? rawurlencode(trim($_GET['name'])) : 'ing'; 

// set to the path where you want your images stored 
$dirname = "/your/base/path/wherever/"; 
// use a while loop to make sure or new filename does not exist 
while (true) { 
    // now build unique filename 
    $filename = uniqid($prepend_filename, true) . '.jpg'; 
    // if filename is unique (file does not exist) then exit loop 
    if (!file_exists($dirname . $filename)) break; 
} 

/* --- save image to file --- */ 

imagejpeg($jpg_image, $dirname . $filename); 

/* --- output image to browser --- */ 

readfile($dirname . $filename); 

所以這將基本上工作。唯一不太好的解決方案是,首先您要訪問磁盤來寫入映像,然後您必須重新訪問該文件以將其輸出到瀏覽器。還有另一種技術,您可以使用,以減少文件訪問:

/* --- output image to browser ---*/ 

// use output buffering to capture outputted image stream 
ob_start(); 
// output the image to output buffer 
imagejpeg($jpg_image); 
// stop capture, flush output to browser and save as string 
$img_data = ob_get_flush(); 

/* --- save image to file --- */ 

$fp = fopen($dirname . $filename, 'w'); 
fwrite($fp, $img_data); 
fclose($fp); 

所以這樣做的好處是,你不會有兩次訪問磁盤。

如果您不想將圖像作爲原始圖像格式返回,但實際上希望立即將其顯示在您的html頁面中,則有兩種方法。

方法1(刪除上面重複部分的註釋)在這裏我們創建圖像,保存它的文件並用我們創建的文件名生成html輸出。

<?php 

/* --- create unique filename --- */ 

$prepend_filename = (isset($_GET['name']) ? rawurlencode(trim($_GET['name'])) : 'ing'; 
$dirname = "/your/base/path/wherever/"; 
while (true) { 
    $filename = uniqid($prepend_filename, true) . '.jpg'; 
    if (!file_exists($dirname . $filename)) break; 
} 

/* --- save image to file --- */ 

imagejpeg($jpg_image, $dirname . $filename); 

// now the difference starts 

?><html> 
    <head> 
     <title>Your title here</title> 
     <!-- the rest of your head here --> 
    </head> 
    <body> 
     <img src="http://yourserver.com/your/base/path/wherever/<?php 
      echo $filename; 
     ?>" width="100%" /> 
    </body> 
</html> 

方法2開始是與上述相同,差別開始保存圖像時,我們再次使用輸出緩衝方法,但此時,我們的輸出傳遞給IMG標記爲base64編碼的字符串。討厭,討厭:)

/* Generating the filename is the same as above (not copied here). 
    Output buffering same as prior sample, with one difference: 
    Now we use ob_get_clean() instead of ob_get_flush() because 
    we do not want to output image. 
*/ 
ob_start(); 
imagejpeg($jpg_image); 
$img_data = ob_get_clean(); // NOTE: ob_get_clean() not ob_get_flush() 

/* --- save image to file --- */ 

$fp = fopen($dirname . $filename, 'w'); 
fwrite($fp, $img_data); 
fclose($fp); 

?><html> 
    <head> 
     <title>Your title here</title> 
     <!-- the rest of your head here --> 
    </head> 
    <body> 
     <img src="data:image/jpeg;base64,<?php 
      echo base64_encode($img_data); 
     ?>" width="100%" /> 
    </body> 
</html> 

所以在這裏我們使用的緩衝$img_data的文件寫入到磁盤和在HTML頁面中直接輸出,而不必調用從服務器上的文件瀏覽器(但具有較大的HTML源明顯)

+0

我添加了RightClick建議的解決方案,將傳遞給腳本的rawurlencoded name參數添加到gi已經在文件名隨機的字符 –

+0

我想打電話給該圖像的網頁上,包括HTML' <身體

learner

+0

@learner所以你去了,添加了兩個樣本,你如何能夠直接生成你的新生成的圖像包括HTML源代碼。 –