2010-08-17 22 views
23

Aşağıdaki kodu kullanıyorum ve dosyaları yerel makinemde başarıyla yüklüyor. Yerel makinemde "Başarıyla yüklendi" gösteriliyor.PHP move_uploaded_file() hatası?

// Upload file 
$moved = move_uploaded_file($_FILES["file"]["tmp_name"], "images/" . "myFile.txt"); 

if($moved) { 
    echo "Successfully uploaded";   
} else { 
    echo "Not uploaded"; 
} 

Ama benim çevrimiçi sunucuda bu kodu kullanıldığında o zaman dosya yükleyerek değildir ve sadece "yüklenen değil" mesajı gösteren.

Sorunun ne olduğunu nasıl anlayabilirim ve asıl sorunu kullanıcıya göstermeyi nasıl sağlayabilirim? Web sunucusu "images /" dizinine

+1

Web sunucusundaki görüntüler klasörünüz var mı? Klasör sadece okunabilir mi, yoksa yazabilir misiniz? – gabe3886

+0

Herhangi bir PHP tarafından oluşturulan hata mesajı? Btw, $ taşınmasını kullanmanıza gerek kalmaz, move_uploaded_file komutunu ifadeye koyabilirsiniz. – fabrik

+0

@all: Sunucuda herhangi bir hata/uyarı göstermemesi sorunudur. Görüntüler klasörü var ve FileZilla'yı kullanarak bu klasördeki dosyaları yükleyebilirim. – Awan

cevap

33

Kontrol dosya tamam yüklenir kontrol eder misiniz? Belki de max_post_size veya max_upload_filesize değerini aştınız. FileZilla kullanarak oturum açarken, dosyaları PHP wiritng ile yüklerken, bu dosyayı apache (exaplme www-data için) kullanan kullanıcılardan alıyorsunuz, resim için chmod 755'i kullanmaya çalışın.

+0

Bu klasördeki dosyaları FileZilla kullanarak elle yükleyebilirim, bu haklara sahip olduğu anlamına gelir. Başka bir ihtimal var mı? – Awan

+10

FileZilla, web sunucusunun izinlerinin olduğunu kanıtlamaz. Web sunucusu büyük olasılıkla sizden farklı bir kullanıcı altında çalışacaktır. İzinlerinin olduğundan emin olmak için, izinleri yalnızca 777 olarak ayarlayın ve ardından sınayın. Bu bir izin sorunu veya başka bir şey olduğunu kanıtlamalıdır. –

+0

chown -R 777 yourdirectory –

2

yazma izinlerine sahip olduğunu

16

nasıl bilebilirim ki sorunu

Kolay olanı. Web sunucusunun hata günlüğüne bakın.

Kullanıcıya gerçek sorunu nasıl görüntüleyebilirim? ASLA

bunu.
Ortalama bir kullanıcı, bu hatanın hiçbirini açığa çıkaramaz.
Kötü amaçlı bir kullanıcı, özellikle çok bilgilendirici bir hata iletisi biçiminde geri bildirim almamalıdır.

Sadece bahane olan bir sayfa göster.

Sunucunun hata günlüğüne erişiminiz yoksa, göreviniz daha da karmaşık hale gelir.
Hata mesajlarıyla bağlantı kurmanın birkaç yolu vardır.

kod

ini_set('display_errors',1); 
error_reporting(E_ALL); 

Bu satırları ekleyebilir veya özel hata günlük dosyası

ini_set('log_errors',1); 
ini_set('error_log','/absolute/path/tp/log_file'); 

yapmak ve bazı başka yolları da vardır ekranda hata iletileri görüntülemek için.
fakat gerçek hata mesajı olmadan hareket edemeyeceğinizi anlamalısınız.

$upload_dir = $_SERVER['DOCUMENT_ROOT'] . "/images/"; 

if (is_dir($upload_dir) && is_writable($upload_dir)) { 
    // do upload logic here 
} else { 
    echo 'Upload directory is not writable, or does not exist.'; 
} 

Bu anında herhangi bir dosya izni hatalarını bayrak olacak: Bu deneyin karanlık

+0

Eh, bir geliştirme sitesinde hataları göstermek iyidir. Hataları bir günlük dosyasına (ör. Paylaşılan barındırma) yeniden yönlendirmek her zaman mümkün değildir. –

+0

@Pekka canlı bir atmdan bahsediyoruz. Ve dürüstçe, böyle bir barındırma hemen terk edilmeli. –

30

kör olmak zor.

+0

Bunlardan hiçbiri değil. Ve böyle bir hata işleme işe yaramaz. –

+12

Bilgilendirilmemiş olanlar için detaylara dikkat etmek ister misiniz? –

+1

'Yükleme dizini yazılabilir değil ya da mevcut değil' diyor. Nasıl çözülür, lütfen açıklayınız? –

1

veya suexec'i çalıştırın ve izinleri yeniden değiştirmek zorunda kalmayın.

5

move_uploaded_file() döndürür: apache süreci Kaynak veya hedef dizinlere okuma/yazma izinlerine sahip değilse dosya adı

  • FALSE ve hata günlüğünde issue a warning geçersiz

    1. FALSE eğer

    PHP Hata Günlüğü

    Benim php hata günlüğü oldu: /var/log/httpd/error_log ve bu hataları vardı:

    Uyarı: move_uploaded_file (images/robot.jpg): failed to open stream:/var/www/html/mysite/mohealth içinde izin engellendi.) (move_uploaded_file: hattında 78

    Uyarı php hattında /var/www/html/mysite/mohealth.php olarak resimlerini/robot.jpg 'ile '/ tmp/phpsKD2Qm' taşınamıyor 78

    move_uploaded_file() dosyaları geçici bir dizinden hedef dizine taşımayı dener. Apache işlemi dosyaları taşımayı denediğinde, geçici olarak okuyamadı veya hedef direk yazamadı.

    1. kullanıcı Apache (Web Sunucusu) Kullanıcının bu komutla apache hizmetini çalıştıran Kontrol çalıştıran bul: ps aux | grep httpd. İlk sütun kullanıcı adıdır. Geçici Dir

    2. Kontrol Oku İzin: Sizin bir php sayfasında echo sys_get_tmp_dir(); arayarak geçici dir yolunu bulabilirsiniz. apache kullanıcı burada

    3. yazma erişimi olup olmadığını görmek için sorunu ls -ld /var/www/html/destination-directory: apache kullanıcı Hedef Dir burada

    4. Kontrol yazma izni okumak erişimi varsa Ardından komut satırında, konu ls -ld /tmp/temporary-dir görmek

      kullanılarak chown veya chgrp

    5. Yeniden Apache kullanarak gerekli izinleri ekleyin sudo service httpd restart

  • +0

    Kullanıcı pencerelerde nasıl kontrol edilir? – Black

    +1

    Sorun, "kaynak" anahtar kelimesiyle çözüldü. Şuna bak: "move_uploaded_file() işlevi, FALSE değerini döndürür ve apache işleminin 'kaynak' veya hedef dizinlere okuma/yazma izinleri yoksa, hata günlüğüne bir uyarı verir." Bu nedenle, proje dizininize tüm izinleri vermek yeterli değildir ve aynı zamanda kaynak dosyanın konumuna tüm izinleri vermelidir. – Hasan

    22

    Düzenleme gibi olmaya kod aşağıda:

    // Upload file 
    $moved = move_uploaded_file($_FILES["file"]["tmp_name"], "images/" . "myFile.txt"); 
    
    if($moved) { 
        echo "Successfully uploaded";   
    } else { 
        echo "Not uploaded because of error #".$_FILES["file"]["error"]; 
    } 
    

    Size aşağıdaki hata kodu birini 1 ila 8 değerleri verecektir:

    UPLOAD_ERR_INI_SIZE = Değer: 1; Yüklenen dosya, php.ini dosyasındaki upload_max_filesize yönergesini aşıyor.

    UPLOAD_ERR_FORM_SIZE = Değer: 2; Yüklenen dosya, HTML biçiminde belirtilen MAX_FILE_SIZE yönergesini aşıyor.

    UPLOAD_ERR_PARTIAL = Değer: 3; Yüklenen dosya yalnızca kısmen yüklendi.

    UPLOAD_ERR_NO_FILE = Değer: 4; Hiçbir dosya yüklenmedi.

    UPLOAD_ERR_NO_TMP_DIR = Değer: 6; Geçici klasör eksik. PHP 5.0.3'te tanıtıldı.

    UPLOAD_ERR_CANT_WRITE = Değer: 7; Dosya diske yazılamadı. PHP 5.1.0'da tanıtıldı.

    UPLOAD_ERR_EXTENSION = Değer: 8; Bir PHP uzantısı dosya yükleme işlemini durdurdu. PHP, dosya uzantısının durmasına neden olan uzantının belirlenmesini sağlamaz; phpinfo() ile yüklenen uzantıların listesini incelemek yardımcı olabilir.

    0

    sizin form etiketi, bu niteliği olup olmadığını kontrol edin:

    enctype="multipart/form-data"

    0
    $uploadfile = $_SERVER['DOCUMENT_ROOT'].'/Thesis/images/'; 
    $profic = uniqid(rand()).$_FILES["pic"]["name"]; 
    
    if(is_uploaded_file($_FILES["pic"]["tmp_name"])) 
    { 
        $moved = move_uploaded_file($_FILES["pic"]["tmp_name"], $uploadfile.$profic); 
        if($moved) 
        { 
         echo "sucess"; 
        } 
        else 
        { 
         echo 'failed'; 
        } 
    } 
    
    0

    sanal barındırma On disk quota kontrol edin.

    Eğer kota aşılırsa, move_uploaded_file dönüş hatası.

    Not: Uzun zamandır bunu arıyordum :)