move_uploaded_file memberikan kesalahan "gagal membuka streaming: Izin ditolak"

143

Saya terus mendapatkan kesalahan ini ketika mencoba mengkonfigurasi direktori unggah dengan Apache 2.2 dan PHP 5.3 di CentOS.

Di php.ini:

upload_tmp_dir = /var/www/html/mysite/tmp_file_upload/

Di httpd.conf:

Directory /var/www/html/mysite/tmp_file_upload/>
    Options  -Indexes
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>
<Directory /var/www/html/mysite/images/>
                Options -Indexes
</Directory>

Izin direktori CentOS:

drwxrwxr-x 2 root root 4096 Nov 11 10:01 images
drwxr-xr-x 2 root root 4096 Nov 12 04:54 tmp_file_upload

Apa pun yang saya lakukan, saya tetap mendapatkan kesalahan ini dari PHP ketika saya mengunggah file:

Peringatan: move_uploaded_file (images / robot.jpg): gagal membuka streaming: Izin ditolak di /var/www/html/mysite/process.php on line 78

Peringatan: move_uploaded_file (): Tidak dapat memindahkan '/ tmp / phpsKD2Qm' ke 'images / robot.jpg' di /var/www/html/mysite/process.php on line 78

Seperti yang Anda lihat, tidak pernah mengambil konfigurasi dari file php.ini mengenai file unggahan.

Apa yang saya lakukan salah di sini?

pengguna63898
sumber
775? Mungkin server Anda berjalan sebagai bukan siapa-siapa. Hanya root yang dapat menulis dalam kasus ini (izin "gambar" Anda) ...
Konrad Borowski
apa artinya ? bagaimana saya bisa mengubahnya?
user63898
Ingat bahwa SEMUA direktori induk juga harus memiliki izin yang tepat.
Sridhar Sarnobat

Jawaban:

188

Ini karena imagesdan tmp_file_uploadhanya dapat ditulis oleh rootpengguna. Agar unggahan berfungsi, kita perlu membuat pemilik folder-folder itu sama dengan pemilik proses httpd ATAU membuatnya bisa ditulis secara global (praktik buruk).

  1. Periksa apache pemilik proses: $ps aux | grep httpd. Kolom pertama akan menjadi pemilik biasanyanobody
  2. Ubah pemilik imagesdan tmp_file_uploadmenjadi nobodyatau apa pun pemilik yang Anda temukan di langkah 1.

    $sudo chown nobody /var/www/html/mysite/images/
    
    $sudo chown nobody /var/www/html/mysite/tmp_file_upload/
  3. Chmod imagesdan tmp_file_uploadsekarang dapat ditulis oleh pemilik, jika diperlukan [Sepertinya Anda sudah memiliki ini di tempat]. Disebutkan dalam jawaban @Dmitry Teplyakov.

    $ sudo chmod -R 0755 /var/www/html/mysite/images/
    
    $ sudo chmod -R 0755 /var/www/html/mysite/tmp_file_upload/
  4. Untuk detail lebih lanjut mengapa perilaku ini terjadi, periksa manual http://php.net/manual/en/ini.core.php#ini.upload-tmp-dir , perhatikan bahwa ini juga berbicara tentang open_basedirarahan.

Laith Shadeed
sumber
4
Terima kasih: pemilik lama kami telah menjadi daemon sekarang menjadi apache
zzapper
Perbaikan ini berlaku untuk situasi di mana Anda mungkin mengubah jenis server php dari fast_CGI, CGI ke Apache_mod sebagai plesk dll. Dapat melanjutkan dengan izin pengguna asli bukan apache. Ini memperbaiki masalah saya.
elliotrock
1
Saya mengalami kesalahan yang sama tetapi proses dan foldernya dimiliki oleh jacob(saya karena ini adalah mesin lokal saya) dan semua folder memiliki 755atau 775.
limeandcoconut
Saya harus memulai kembali proses apache saya sudo service httpd restartsetelah mengubah izin. Kemudian berhasil :) Alih-alih mengubah pemilik, chownsaya menambahkan proses apache saya ke grup 'www' dan menambahkan direktori ini ke grup 'www' yang sama melaluichgrp
Ali Saeed
76

Anda juga dapat menjalankan skrip ini untuk mengetahui pemilik proses Apache:

<?php echo exec('whoami'); ?>

Dan kemudian ubah pemilik direktori tujuan ke apa yang Anda miliki. Gunakan perintah:

chown user destination_dir

Dan kemudian gunakan perintah itu

chmod 755 destination_dir

untuk mengubah izin direktori tujuan.

twlkyao
sumber
3
Terima kasih, ini berhasil untuk saya. Saya pertama kali menggunakan metode Laith Shadeed tapi saya tidak mendapatkan hasil yang sama ketika mengetik ps aux | grep httpd dan <?php echo exec('whoami'); ?>. Adakah yang tahu mengapa?
Semenanjung
1
ps aux | grep https tidak mengembalikan nama pemilik server web. Ini tidak: ps aux | grep -E '[a] pache | [h] ttpd | [_] www | [w] ww-data | [n] ginx' | grep -v root | kepala -1 | cut -d \ -f1 Fron Symfony doc.
David Jacquel
1
Perhatikan bahwa dalam perintah di atas, harus ada dua spasi antara "-d \" dan "-f1". Jika Anda menyalin-menempel apa adanya, Anda mungkin mendapatkan kesalahan seperti "cut: bad delimiter".
Beejor
1
ditambah 1 untuk exec('whoami'). Menyelamatkan saya 30 menit lagi. sedang mengunyah pengguna ubuntu
Deval Khandelwal
11
haruskah ini www-data? biasanya
maxisme
18

Jika Anda memiliki Mac OS X, buka root file atau folder situs web Anda.

Kemudian klik kanan padanya, pergi untuk mendapatkan informasi, pergi ke paling bawah ( Berbagi & Izin ), buka itu, ubah semua hanya-baca untuk membaca dan menulis. Pastikan untuk membuka gembok, pergi ke ikon pengaturan, dan pilih Terapkan ke item terlampir ...

hawkar ITstudent
sumber
Mengapa Anda berkomentar di Mac OS ketika pertanyaannya adalah tentang sistem Linux?
Kmeixner
7
Hai Hawkar, terima kasih atas balasan Anda. Saya menggunakan mac dan jawaban Anda memecahkan masalah saya. Terima kasih banyak.
Sanjay Sharma
2
Suka jawaban ini
Alexey Sh.
2
@Kmeixner pertanyaan ini tentang Linux tapi saya punya masalah yang sama persis pada OSX saya. Terima kasih atas komentar ini, ini bekerja untuk saya setelah saya mengubah opsi penulisan di folder /private/var/tmppada Mac saya.
Salam
Ini adalah posting yang lebih lama, tetapi itulah yang perlu saya lakukan. Terima kasih
TheRobQ
14

Ini berhasil untuk saya.

sudo adduser <username> www-data
sudo chown -R www-data:www-data /var/www
sudo chmod -R g+rwX /var/www

Kemudian logout atau reboot.

Jika SELinuxmengeluh, coba yang berikut ini

sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www(/.*)?'
sudo restorecon -Rv '/var/www(/.*)?'
Junius L.
sumber
menyelamatkan hidup saya :) .. saya menggunakan GIT post-recive hook untuk menyebarkan web saya, dan setiap kali saya menggunakan ijinnya ditolak kesalahan, menambahkan pengguna git ke www-data memperbaikinya :) terima kasih
Zalaboza
Ini jawaban terbaik.
saviour123
12

Saya ingin menambahkan ini ke saran sebelumnya. Jika Anda menggunakan versi Linux yang memiliki SELinux diaktifkan maka Anda juga harus menjalankan ini dalam shell:

chcon -R --type httpd_sys_rw_content_t /path/to/your/directory

Bersamaan dengan memberikan izin pengguna server web Anda baik melalui grup atau mengubah pemilik direktori.

Chris
sumber
restorecon -R -v /path/to/your/directorymungkin juga perlu dimasukkan dalam ini setelahnya. access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/…
AbsoluteƵERØ
mungkin benar, tetapi saya berada di bawah asumsi bahwa chcon "mengubah konteks" yaitu itu baru saja diubah. apa yang Anda lihat menggunakan "semanage fcontext" pertama yang memasukkannya ke beberapa file pengaturan "file_contexts.local", namun itu tidak pernah mengubah konteksnya.
Chris
@ Chris, Terima kasih kawan. Ini menyelesaikan masalah saya. Bisakah Anda menjelaskan tentang masalah ini? Apa yang sebenarnya dilakukan perintah ini? Saya membuka halaman manual dan bahkan info untuk chcon dan tidak menemukan nilai dari tipe yang Anda masukkan. Saya agak bingung di sini.
Joker
itu membuat direktori atau file dapat dibaca oleh server web (httpd) ... saya jujur ​​tidak mau dan mungkin tidak bisa menjelaskan selinux karena saya hampir tidak memiliki pemahaman di dalamnya sendiri ... silakan lihat nsa.gov/what-we-do / riset / selinux / dokumentasi dan access.redhat.com/documentation/en-us/red_hat_enterprise_linux/…
Chris
11

Ubah izin untuk folder ini

# chmod -R 0755 /var/www/html/mysite/images/

Dmitry Teplyakov
sumber
1
melakukannya sekarang seperti: drwxrwxr-x 2 root root 4096 Nov 11 10:01 gambar juga di: drwxrwxr-x 2 root root 4096 Nov 12 04:54 tmp_file_upload tetapi masih kesalahan yang sama
user63898
7

Coba ini:

  1. buka / etc / apache2 / envvars

    sudo gedit /etc/apache2/envvars
  2. ganti www-datadenganyour_username

    "export APACHE_RUN_USER=www-data" 

    ubah dengan

    export APACHE_RUN_USER='your_username' 
redrider
sumber
7

Saya mengalami masalah terkait ini bahkan setelah sudah berhasil menjalankan komposer. Saya memperbarui komposer, dan ketika berlari composer installatau php composer.phar installmendapat:

... gagal membuka streaming: Izin ditolak ...

Ternyata setelah banyak penelitian bahwa jawaban sebelumnya tentang mengubah izin untuk folder berfungsi. Mereka hanya direktori yang sedikit berbeda sekarang.

Dalam instal saya, pada OS X, file cache ada di /Users/[USER]/.composer/cache, dan saya mengalami masalah karena file cache dimiliki oleh root. Mengubah kepemilikan '.komposer' secara rekursif kepada pengguna saya memecahkan masalah.

Inilah yang saya lakukan:

sudo chown -R [USER] cache

Kemudian saya menjalankan komposer menginstal lagi dan voila!

abaumer
sumber
5

Masalah ini terjadi ketika pengguna apache (www-data) tidak memiliki izin untuk menulis di folder. Untuk memecahkan masalah ini, Anda harus memasukkan pengguna ke dalam grup www-data.

Saya baru saja membuat ini:

Jalankan kode php ini <?php echo exec('whoami'); ?>untuk menemukan pengguna yang digunakan oleh apache. Setelah itu, jalankan perintah di terminal:

user@machine:/# cd /var/www/html

user@machine:/var/www/html# ls -l

Ini akan mengembalikan sesuatu seperti ini:

total of files

drwxr-xr-x 7 user group size date folder

Saya menyimpan pengguna tetapi mengubah grup menjadi www-data

chown -R user:www-data yourprojectfoldername

chmod 775 yourprojectfoldername
Jefferson Romano
sumber
4

Solusinya sangat mudah. Hanya klik kanan folder IMAGE (tujuan), buka properti, klik tab izin, dan ubah akses orang lain ke Buat dan hapus file .

Basim
sumber
Cara tercepat NAMUN, hanya Anda yang menggunakan GUI untuk FTP (FileZilla, WinSCP)
CLOUGH
3

Hanya mengubah izin tmp_file_upload ke 755 Mengikuti adalah perintah chmod -R 755 tmp_file_upload

Sarang
sumber
2

Coba ini

find /var/www/html/mysite/images/ -type f -print0 | xargs -0 chmod -v 664

Simone
sumber
mendapatkan: chmod: operan yang hilang setelah `664 '
user63898