【问题标题】:move_uploaded_file(): Unable to movemove_uploaded_file():无法移动
【发布时间】:2016-02-29 14:13:13
【问题描述】:
$targetFolder = '/LP/media/image'; // Relative to the root

if (!empty($_FILES)) {
    $tmpName = $_FILES['Filedata']['tmp_name'];
    $targetPath = $_SERVER['DOCUMENT_ROOT'] . $targetFolder;
    //$ext = end(explode('.', $_FILES['Filedata']['name']));
    $targetFile = rtrim($targetPath, '/') . '/' . $_FILES['Filedata']['name'];

    // Validate the file type
    echo $targetFile;
    $fileParts = pathinfo($_FILES['Filedata']['name']);
    $fileTypes = array('jpg', 'jpeg', 'png','JPG','JPEG','PNG'); // File extensions
    if (in_array($fileParts['extension'], $fileTypes)) {
        move_uploaded_file($tmpName, $targetFile);
        //echo '1'.$fileParts['filename'];
        // echo $fileParts['filename'];

        $aimage = file_get_contents($tmpName);

       // echo '<img src="data:image/jpeg;base64,' . base64_encode($aimage) . '" width=\'100\' height=\'100\' />';
    } else {
        echo 'Invalid file type.';
    }
}
?>

相同的代码在我的本地机器上运行,但部署在远程服务器上。然后得到以下错误。

/home/username/public_html/LP/media/image/default_avatar.png
警告:move_uploaded_file(/home/username/public_html/LP/media/image/default_avatar.png) : 无法打开流:在 /home/username/public_html/uploadify/gallery.php 中没有这样的文件或目录 28

警告:move_uploaded_file():无法将“/tmp/phpoe0fBd”移动到 /home 中的“/home/username/public_html/LP/media/image/default_avatar.png” /username/public_html/uploadify/gallery.php28 行

【问题讨论】:

  • 服务器上不存在您要移动的目录
  • 检查权限。
  • 可能什么都没有。这是我所说的关于名称属性和有效编码类型的 HTML 表单。我不知道 uploadify 足以进一步评论,但上传文件需要有效的 enctype 和 POST 方法。有人提到文件夹信箱。正如我在下面所说的,这仅适用于您在 UNIX/LINUX 上。在您打开 PHP 标记(例如 &lt;?php error_reporting(E_ALL); ini_set('display_errors', 1);)之后将错误报告添加到文件顶部,然后是其余代码,以查看它是否产生任何结果。
  • 还可以检查服务器上允许上传的最大大小
  • 服务器上的 @jWeaver $targetFolder = '/LP/media/image'; 意味着它将在文件系统的根目录中查找,因为斜线 / 它将无法找到目录。相反,您应该使用相对路径。

标签: php uploadify


【解决方案1】:

您提供的代码并不能很清楚地说明问题的根源,因此我将提供完整的 sn-p 给您,您可以从中得出更好的结论。

在这种情况下,我使用名为“documents”的表单数据将一个数组从 JavaScript 发送到我的 PHP 文件。我还修改了文件名,使其变为:“filename_optional_$i(int)”。

for($i=0; $i<count($_FILES['documents']['name']); $i++){
    list($dump, $extention) = explode(".", (string)$_FILES['documents']['name'][$i]);
    $document_name = $file_name.'_optionnel'.$i;
    if(($_FILES['documents']['size'][$i] < 500000)){
        if ($_FILES['documents']["error"][$i] > 0){
            echo 'Erreur.';
        }else{
            if(file_exists( $directory_path . $document_name . "." . $extention)) {
                echo 'Le fichier existe déjà.';
            }else{
                $sourcePath = $_FILES['documents']['tmp_name'][$i];
                $targetPath = $directory_path . $file_name ."/". $document_name . "." . $extention;
                array_push($attachments, $targetPath);
                move_uploaded_file($sourcePath, $targetPath);
            }
        }
    }else{
        echo 'Le fichier est trop grand.';
    }
}

确保您的路径变量指向正确的文件夹。比如说,如果你想让你的文件进入文件夹图像,你必须这样做:

path_to_folder/images/ 而不是 path_to_folder/images

编辑:

您的文件名和目录路径变量应如下所示:

/*$nom, $prenom and $user_id come from database values*/
$file_name = $nom."_".$prenom."_".$user_id;

$directory_path = dirname( __FILE__ ) . '/user_docs/';

/* Create mask */ 
$oldmask = umask(0);

/* Create the folder for user */
$directory = mkdir($directory_path.$file_name, 0777);

/* redo the mask */
umask($oldmask);

我对这个网站很陌生,但我能为您做的至少是为您提供我为帮助您而做的代码。我写了一些 cmets 来指导你。

Full code source for upload

【讨论】:

  • 我应该如何处理这段代码?我应该如何以及在哪里编写这段代码?我应该期待什么输出?
  • 这个 sn-p 正在按预期工作,您可以简单地看一下它并将其与您的进行比较,请看一下编辑,因为它添加了一些实用信息。
  • “这是我的文件名和目录路径变量的样子:” - 是的,但我们正在讨论 OP 的代码应该是什么样子。仅仅因为这适用于“你的”机器,并不意味着它适用于他们的机器。
【解决方案2】:

我有这个小功能(不是最好的),但在我的情况下它“有效”,上传的文件必须被移动或被删除,所以我将它们移动到我的 PHP 文件旁边的文件夹并回显指向它的链接(您可以将其移动到其他任何地方,重命名或其他任何地方:

function save_file() {
    $gs_name = $_FILES['uploaded_files']['tmp_name'];
    if(is_readable($gs_name) && $_FILES['uploaded_files']['error'] == 0) { //Tells whether a file exists and is readable. no error during upload (0)
        move_uploaded_file($gs_name, 'upload/'.$_FILES['uploaded_files']['name']);

        echo "saved.<a href='upload/".$_FILES['uploaded_files']['name']."' target='_blank'/>".$_FILES['uploaded_files']['name']."</a><br/>";
        echo "<p><a href='upload/' target='_self'>Uploaded files.</a></p>";
        echo "<p><a href='upload_file.php' target='_self'>Continue...</a></p>";
    }
}

关于它的重要部分是如果:

if(is_readable($gs_name) && $_FILES['uploaded_files']['error'] == 0)

它允许它检查文件是否可以复制以及是否没有可能导致文件损坏的错误...我指出这一点是因为路径似乎没问题,其他人已经提到了文件和文件夹权限。

【讨论】:

    【解决方案3】:

    试试下面的代码。应该很容易识别错误:

    <?php
    
    $upload_dir = $_SERVER['DOCUMENT_ROOT'] . '/LP/media/image';
    
    if (isset($_FILES['Filedata'])) {
    
        $file = $_FILES['Filedata'];
    
        if ($file['error'] !== UPLOAD_ERR_OK) {
            echo 'error: ', $file['error'], PHP_EOL;
            exit;
        }
    
        $allowed = array('jpg', 'jpeg', 'png');
        $extension = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
        if (!in_array($extension, $allowed)) {
            echo 'error: invalid file extension', PHP_EOL;
            exit;
        }
    
        $target = $upload_dir . '/' . basename($file['name']);
        if (!move_uploaded_file($file['tmp_name'], $target)) {
            echo 'error: move_uploaded_file failed', PHP_EOL;
            print_r(error_get_last());
            exit;
        }
    
        echo 'success', PHP_EOL;
        echo $target, PHP_EOL;
    }
    

    【讨论】:

      【解决方案4】:

      谁在尝试了这里建议的所有解决方案后仍然有这个问题.. 他们必须尝试这个小事情是尊重文件夹名称的字母敏感大小写.. 文件夹“Upload”“u下载”..谢谢

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-11
        • 2018-11-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多