DOSYALAR superglobal dizi kullanarak PHP Dosya Yükle,

2 Cevap php

Let's say that I'm setting up an upload feature for a project. I'm using PHP5, and I was wondering if by using the $_FILES superglobal array, I could have access to the "tmp_name" array key , which is the temporary path and name of the file being uploaded to display a preview of the image, before moving it to the "uploads" folder in the server.

What I had in mind is something like this: Use jQuery to detect when the "file" input filed changes (when the user selects an image file), then place an ajax call to upload the the file, which will move it to the temp folder even before I use "move_uploaded_file". If I can somehow access the "tmp_name" array key, I could probably put it into and "img" tag to display a preview. Later move the file to it's final location when the submit button is clicked.

Ben kendi başıma gerçekleştirmek için heyecan duyarım beri ben sadece herhangi bir şekilde bu dizi anahtara erişimi olup olmadığını öğrenmek istiyorsanız, herhangi bir kod örnekleri ya da bir şey demiyorum.

2 Cevap

Evet, yapabilirsiniz.

PHP, bir kullanıcı bir $ _FILES süper küreseli ile bir form gönderdiğinde yüklenen dosya hakkında yararlı bilgiler ile doldurulur. Içinizde bayt her yüklenen dosyanın orijinal adı, içerik tipi, sunucu üzerinde geçici yükleme konumu, bir hata kodu ve boyutunu bulacaksınız.

Fixing the $_FILES superglobal alınan

İşte örnek $_FILES dizinin web sitesinden alınan print_r çıkışı,

Array
 (
    [download_zip] => Array
     (
        [name] => dummy.txt
        [type] => text/plain
        [tmp_name] => /Applications/MAMP/tmp/php/php5TBPsw
        [error] => 0
        [size] => 1
     )

    [download_screenshot] => Array
     (
        [name] => dummy.txt
        [type] => text/plain
        [tmp_name] => /Applications/MAMP/tmp/php/phpTncd39
        [error] => 0
        [size] => 1
     ) 
)

Sen $files_array['download_zip']['tmp_name'] sözdizimini kullanarak tmp_name erişebilirsiniz.

Update:

$path = $files_array['download_zip']['tmp_name'];
echo "<img src='$path'>"; 

Bir görüntü etiketi Bunları kullanmak için, onlar web kök dışında dosya sistemi, genellikle başka bir yerde olduğundan, web kök içinde bir yerde, ilgili geçici dosyaları saklamak için ihtiyacınız olacak, ve bu yol için çıktı istemiyorum kullanıcı, hem faydasız olacak gibi (bir img etiketi, o yolu harita olamaz), ve kötü güvenlik (sizin dosya sistemi hakkında bilgi veriyor edilmiştir.)

Sen (a) (pahalı) webroot bir noktaya her dosya kopyalarken veya b) web kök içindeki geçici bir klasöre yüklenen tüm dosyaları koymak için yapılandırma değiştirerek bunu yapabilirsiniz büyük güvenlik etkileri).

Keep security in mind while you are planning this out...

Tıpkı diğer geçici dosyaları güvenliği konusunda dikkatli olun. Bu uygulamanın bu kısmı ile ilgili sadece olanları web kök içinde saklanır emin olun. Eğer birileri diğer dosyalara erişimi hesaplamak ve diğer yüklenen verileri web (hatta çok kısa bir süre için) kullanılabilir çünkü çapraz kullanıcı veri ihlali çeşit için izin için yeterli bilgi verdik bulmak istemiyorum kökü.

This may be a better way:

, Geçici adı kapmak şekilde onu karartmak, bir bekçi dosyaya geçecek bir yoluna eklemek ve bunun yerine göndermek için belki de daha iyi bir çözüm olacaktır.

Gibi bir şey

/images/path/to/gatekeeper.png?name=[obfuscated file name here]

Daha sonra emin bekçisi ekleyerek, yerine bir png dosyası daha bir php dosyası olarak kabul edilir hale getirmek için / images / yol / / .htaccess kullanabilirsiniz:

<Files gatekeeper.png>
    ForceType application/x-httpd-php
</Files>

Şimdi, bekçi, dosya adını un-bullak temp yoldan çekin, ve, kullanıcıya herhangi bir şey ortaya gerçek dosya taşıma veya yapılandırma değiştirmeden gönderebilirsiniz.

Daha sonra yenilemek ve dosya (neredeyse kesin olacak) hareket etmesi halinde, sadece kırık bir görüntü olacak, çünkü sadece, sen dosya kalıcı beklemeyin emin olun. Belki bekçisi ile varlığını denetlemek ve bulunamadı değil eğer onlara bir "dosya artık mevcut" görüntü vermek. Ayrıca bekçi düzeyinde sadece görüntü dosyaları veya diğer güvenlik konularında gönderme zorlayabilir.

Siz böylece bekçisini yapabilirsiniz (muhtemelen ... yayınlanmaz, bellekten yazdığınız, ve vb hataları, eksik değerlerin, hiçbir kullanımı vardır, ama bir başlangıç ​​noktası olarak kullanmak mümkün olmalıdır):

<?php
// This is all inside gatekeeper.png, which is just a .php file with a .png extension
// It's not very good code, just an example to point you in the right direction.

// Specify this will be a png file for the browser...
header("content-type: image/png");


//Read the file name from the $_GET and un-obfuscate it.
$file = "/path/to/temp/directory/outside/file/root/that/we/hopefully/have/access/to/";
$file .= $_GET["name"];


// Check that the file exists, and send a "not found" image if not.
// http://us.php.net/manual/en/function.file-exists.php
if (!file_exists($file)) {etc...}


// Read the image file, send it to the user, and close it...
// http://us.php.net/manual/en/function.imagepng.php
$im = imagecreatefrompng($file);
imagepng($im);
imagedestroy($im);


die();

?>