Its your /tmp directories - More info below It seems that when you use move_uploaded_file() with SuPHP or FastCGI with SuExec the File Permissions are being set to 600 instead of 644. This means any readable files like images, text, etc or not accessable by http. You need at least 640 to have be accessable by http. At first everyone said it can be set in /etc/suphp.conf. Change umask to 0022 instead of 0077. Then restart apache. FYI, if you are using FastCGI with suExec you can set umask in your sites ".php-fcgi-starter" file by adding "umask 0022" Ex. Code: #!/bin/sh umask 0022 PHPRC="/var/www/php-fcgi-scripts/web1/" export PHPRC NOTE: You can also edit "/usr/local/ispconfig/server/conf/php-fcgi-starter.master", but be asure to edit it directly and not FTP. Editing master files with FTP may result in PHP Parsing Errors. Well my umask was already 0022. So this was not the solution for me. Then everyone said just use chmod() after move_uploaded_file(). Which works great, but is not a good solution for big hosting companies who want to easily migrate multiple sites to their server. Having to change so much php code can be overwhelming. After more research I found that it is not suphp.conf because the umask setting does work. Try mkdir() or fwrite(). Files and directories are set to 755 and 644 just fine. It's not the move_uploaded_file() function either. It's your /tmp directories. Any files created in them are set to 600. The HTTP FILES Upload uses your sites /tmp to upload the file to. Not sure where the source of this 600 fileperms setting is coming from. Maybe your OS, maybe suPHP or suExec core. If you know then please respond !!!!!! I believe it is a security feature to not have any files in /tmp readable, writable, or executable by anyone other then the owner. So when you use move_upload_file() it keeps the fileperms that where originaly set by the /tmp directory or your sites /var/www/site.com/tmp directory. if you use copy() instead of move_uploaded_file() then it will generate 644 instead of 600. Hope this helps. I am still looking for a solution to automaticly set files to 644 with and only using move_uploaded_file(). Is it possable to rewrite the move_uploaded_file() function or append the chmod() after it?