上传文件过程中不会造成服务器端错误 [英] Uploading files without causing server side errors during the process

查看:22
本文介绍了上传文件过程中不会造成服务器端错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我不断地调整我的软件并将其上传到服务器.由于我有客户一直在使用我的在线软件,如果客户单击链接(例如在 1 秒标记处)时部分上传了 PHP 文件(假设上传需要 3 秒),他们会收到错误,因为文件还在上传中...

I continually make tweaks to my software and upload it to the server. As I have customers using my online software all the time, if a PHP file is partially uploaded (let's say it takes 3 seconds to upload) when a customer clicks a link (say at the 1 second mark) they get an error because the file is still uploading...

Parse error: syntax error, unexpected $end in /inc/functions.php on line 475

因为我在澳大利亚,所以我们的互联网......好吧......不是很快"是一个很好的表达方式.

As I'm in Australia, our internet... well... "isn't very fast" is a nice way of putting it.

上传文件时是否使用了任何技术,以免给使用该软件的客户造成错误?

Are there any techniques used when uploading files so it does not cause errors for customers using the software?

我唯一能做的就是上传文件到另一个目录,然后运行一个 PHP 脚本,以超快的速度复制文件......但是有更好的解决方案吗?

Only thing I can thing of is uploading files to say another directory then running a PHP script that copies the files across super fast... But is there better solutions?

最终代码

感谢下面的 Greg,我找到了做事的最佳方式.以为我会分享我的最终代码.这有点粗糙但确实有效...希望它可以帮助某人

Thanks to Greg below I was able to figure out the best way to do things. Thought I'd share my final code. It's a bit rough but does the trick... Hopefully it helps someone

<?php

// root path
define('ABSPATH', dirname(__FILE__) . '/');

// messages
$GLOBALS['copied'] = array();
$GLOBALS['failed'] = array();
$GLOBALS['folders'] = array();

// you have to submit the form (added security)
if (isset($_POST['copy'])) {

    $GLOBALS['devuploads_folder'] = '_devuploads';

    function find_files($dir) {
        if ($dh = opendir(ABSPATH . $dir)) {
            while (($file = readdir($dh)) !== false) {

                // ignore files
                if ($file === '.' || $file === '..')
                    continue;

                // delete temporary files (optional)
                if ($file == '.DS_Store') {
                    unlink(ABSPATH . $dir . $file);
                    continue;
                }

                // determine paths                  
                $live_path = str_replace($GLOBALS['devuploads_folder'] . '/', '', $dir . $file);                
                $dev_file = $dir . $file;                   
                $live_file = $live_path;
                $dev_file_path = ABSPATH . $dir . $file;                    
                $live_file_path = ABSPATH . $live_path;

                // it's a file
                if (is_file(ABSPATH . $dir . $file)) {  

                    // check if the file has been updated or it's a brand newy
                    $updated_file = $new_file = false;
                    if (file_exists($live_file_path)) {                                 
                        $dev_file_modified = filemtime($dev_file_path);     
                        $live_file_modified = filemtime($live_file_path);                                               
                        if ($dev_file_modified > $live_file_modified)
                            $updated_file = true;                       
                    } else {
                        $new_file = true;
                    }

                    // move the file
                    if ($updated_file || $new_file) {
                        if (copy($dev_file_path, $dev_file_path . '.bak')) {
                            if (rename($dev_file_path . '.bak', $live_file_path))
                                if ($new_file)
                                    $GLOBALS['copied'][] = '<strong>New File:</strong> ' . $dev_file . ' moved to ' . $live_file;   
                                else
                                    $GLOBALS['copied'][] = $dev_file . ' moved to ' . $live_file;   
                            else
                                $GLOBALS['failed'][] = '<strong>Rename failed:</strong> ' . $dev_file . ' to ' . $live_file;
                        } else {
                            $GLOBALS['failed'][] = '<strong>Copy failed:</strong> ' . $dev_file . ' to ' . $dev_file . '.bak';
                        }
                    }

                // it's a folder
                } else if (is_dir(ABSPATH . $dir . $file)) {

                    // create new folder if it doesn't exist
                    if (!is_dir($live_file_path)) {
                        $GLOBALS['folders'][] = '<strong>Created:</strong> ' . $live_file;  
                        mkdir($live_file_path, 0755);   
                    }

                    // keep digging
                    find_files($dir . $file . '/');

                }

            }
            closedir($dh);
        }
    }

    find_files($GLOBALS['devuploads_folder'] . '/');

}

?>
<!DOCTYPE HTML>
<html>
<head>
    <title>Copy Changes</title>
    <style type="text/css">
    h1 {
        font: normal 20px Arial, Helvetica, sans-serif;
        line-height: 24px;
        }
    p, li {
        font: normal 14px Arial, Helvetica, sans-serif;
        line-height: 20px;
        }
    </style>
</head> 
<body>

<?php   
if (!empty($GLOBALS['failed'])) {
    echo '<h1>Errors</h1>';
    echo '<ul>';
    foreach($GLOBALS['failed'] AS $message) {
        echo '<li>' . $message . '</li>';
    }
    echo '</ul>';
}

if (!empty($GLOBALS['folders'])) {
    echo '<h1>New Folders</h1>';
    echo '<ul>';
    foreach($GLOBALS['folders'] AS $message) {
        echo '<li>' . $message . '</li>';
    }
    echo '</ul>';
}

if (!empty($GLOBALS['copied'])) {
    echo '<h1>Copied</h1>';
    echo '<ul>';
    foreach($GLOBALS['copied'] AS $message) {
        echo '<li>' . $message . '</li>';
    }
    echo '</ul>';
}

if (empty($GLOBALS['failed']) && empty($GLOBALS['folders']) && empty($GLOBALS['copied']))
    echo '<p>No updates made.</p>';
?>

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<input type="hidden" name="copy" value="1" />
<p><input type="submit" value="Copy Files" /></p>
</form>

</body>
</html>

推荐答案

如果您的服务器是 Linux(或其他 Unix 变体),则 mv 命令是 atomic 和可以做这种即时更新.先将文件复制到一个临时名称(如file.php.new),然后登录服务器并

If your server is Linux (or other Unix variant), then the mv command is atomic and can do this sort of instantaneous update. First copy the file to a temporary name (like file.php.new), and then log in to the server and

mv file.php.new file.php

(即使 file.php 存在,它也会被新的替换).

(this works even if file.php exists, it will be replaced by the new one).

这篇关于上传文件过程中不会造成服务器端错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆