【问题标题】:file upload wont move after folder created on Windows在 Windows 上创建文件夹后文件上传不会移动
【发布时间】:2018-03-01 16:29:13
【问题描述】:

我在here 中发现了和我一样的案例。我尝试在 PHP 上使用mkdir创建文件夹并且它可以工作,在 MySQL 中它也给了我到文件的链接。但是,为什么我的文件不会移动到新文件夹中?如果我从 php 中删除 md5,它就可以正常工作。 我使用 XAMPP 5.6.30,我的 XAMPP 文件夹不在 C: 系统上。我犯错了吗? 这是我的代码:

<?php
	include('conn.php');
	
	foreach ($_FILES['upload']['name'] as $key => $name){
		
		$newFilename = time() . "_" . $name;
		
        move_uploaded_file($_FILES['upload']['tmp_name'][$key], 'upload/'.md5(time()).'/' . $newFilename);
		
        $location = 'upload/'.md5(time()).'/' . $newFilename;
        
		mkdir('upload/'.md5(time()).'/');
        
		mysqli_query($conn,"insert into photo (location) values ('$location')");
	}
	header('location:index.php');
?>

【问题讨论】:

    标签: php windows file-upload xampp


    【解决方案1】:

    您甚至在创建文件夹之前尝试移动文件

    // Here you try to move the file but the directory is not created yet
    move_uploaded_file($_FILES['upload']['tmp_name'][$key], 'upload/'.md5(time()).'/' . $newFilename);
    $location = 'upload/'.md5(time()).'/' . $newFilename;
    // after trying to move the file you create the directory, but the directory should be created first
    mkdir('upload/'.md5(time()).'/');
    

    这是一个工作代码(请参阅顺序:mkdir first then move_uploaded_file:

    include('conn.php');
    foreach ($_FILES['upload']['name'] as $key => $name){
        $ts = time();
        $crptd = md5($ts);
        $newFilename = $ts . "_" . $name;
        $location = 'upload/'.$crptd.'/' . $newFilename;
        mkdir('upload/'.$crptd.'/');
        move_uploaded_file($_FILES['upload']['tmp_name'][$key], 'upload/'.$crptd.'/' . $newFilename);
        mysqli_query($conn,"insert into photo (location) values ('$location')");
    }
    header('location:index.php');
    

    【讨论】:

    • 让我试试你的代码,我会在几个小时内回复。
    【解决方案2】:

    在这两个步骤之间:

    $location = 'upload/'.md5(time()).'/' . $newFilename;
    mkdir('upload/'.md5(time()).'/');
    

    time() 值不一样,您将其用作常量 您需要先将其存储在 var 中 另外,我认为为您上传的每个文件都创建一个新文件夹并没有什么用处

    【讨论】:

    • 实际上我只是想避免我的用户上传同名文件,而且所有链接都存储在 MySQL 上,这意味着它将帮助用户下载或共享。在我的项目中,用户只有 2 个选项,删除或上传新选项。这个项目是我学校的实习生..
    【解决方案3】:

    首先,我会创建一个名为 uploads 的上传目录

    mkdir 上传

    然后确保它有写权限

    那我就用下面的

    include('conn.php');
    
    foreach ($_FILES['upload']['name'] as $key => $name){
        $newfilename = "";
        $ts = time();
        $newfilename = $ts."_".$name;
        move_uploaded_file($_FILES['upload']['tmp_name'][$key], 'uploads/'.$newfilename);
        mysqli_query($conn,"insert into photo (location) values ('$newfilename');')");
    }
    header('location:index.php');
    

    除非您有理由让所有上传文件夹都是唯一的,否则我认为随着时间的推移会变得混乱且难以管理。

    【讨论】:

    • 我有一个名为“upload”的目录,我使用几乎和你一样的代码,删除md5然后一切恢复正常。但是为什么我不能将我的文件移动到 md5 文件夹名称中?我需要这样做,因为我需要防止/避免用户上传同名文件名。我可以使用$ts."_".$newfilename,但我还是不明白为什么我不能移动它?
    • 你是在制作目录的同时让它可写吗?
    • 我猜是的,我以前从来没有上传过php文件。
    • 当您以编程方式将文件放入目录时,您需要确保该目录具有写入权限,这意味着您可以向该目录写入(移动文件)。 mkdir 将动态创建一个目录,您需要使用 chmod 命令更改权限。我仍然认为不创建目录也可以,只要确保文件名尽可能唯一即可。
    • 使用mkdir后,我可以访问新文件夹,在那里读写一些东西。这是windows,我不认为它需要使用chmod,也许在Linux 是的,我将在下周尝试在Linux 上我可以将我的文件上传到md5 文件夹。
    【解决方案4】:

    问题很可能是 md5(time()) 每次都会生成一个新结果。 我会将其设为变量并使用该变量而不是每次都重新计算它

    【讨论】:

      猜你喜欢
      • 2015-10-30
      • 2013-12-26
      • 2013-11-18
      • 1970-01-01
      • 2014-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多