【问题标题】:can't copy uploaded file (php)无法复制上传的文件(php)
【发布时间】:2017-04-24 17:00:04
【问题描述】:

我正在创建一个网站,在其管理面板上显示上传的新闻。
每篇文章都有一张图片和一个标题(还有描述,但我还没有实现)。
我的问题是,当我尝试发布(并用它上传图片)时,帖子已创建,但图片不存在。

上传者(php):

if (isset($_FILES['image'])) {

//this script
//connects to mysql database
//declares an array that contains table names (array name is db)
require_once("db.php");

//move file to the img folder
move_uploaded_file($_FILES['image']['tmp_name'], "img/" . $_FILES['image']['tmp_name']);

//upload the post to the database
$sql = "INSERT INTO `{$db["posts"]}` (`img`, `text`) VALUES ('img/{$_FILES['image']['tmp_name']}', '{$_POST["text"]}')";
if (!mysql_query($sql)) {
    //display error message
}

}

表单(html):

<form action="post.php" method="POST" enctype="multipart/form-data">
    <label>Image: </label><input type="file" name="image" />
    <br />
    <label>Text: </label><input type="text" name="text" />
    <input type="submit" />
</form>

发布后我通过ftp查看文件,图片不存在。

【问题讨论】:

标签: php file web file-upload upload


【解决方案1】:

$_FILES['image']['tmp_name'] 是一个绝对路径名,如/var/tmp/something。当你将它连接到img/ 时,你会得到一个指向子目录img//var/tmp/something 的路径名。由于子目录不存在,move_uploaded_file() 失败。

您应该使用basename() 来获取文件名部分。

$filename = 'img/' . basename($_FILES['image']['tmp_name']);
move_uploaded_file($_FILES['image']['tmp_name'], $filename);
$text = mysql_real_escape_string($_POST['text']);
$sql = "INSERT INTO `{$db["posts"]}` (`img`, `text`) VALUES ('$filename', '$text')";

不过,我不确定以这种方式使用临时文件的名称是否安全。我不认为有任何保证它永远不会为不同的上传重复相同的名称。

【讨论】:

  • 谢谢,它有效!我不知道临时名称是否可以重复,如果需要,我会检查并更改。
  • 您可能无法在测试中看到重复,这可能只会在很长一段时间内发生。
  • 避免重复名称的一个很好的解决方案是将文件名设置为上传日期,如果已经存在,请在文件名末尾添加一些内容(例如 -)。
猜你喜欢
  • 2019-12-26
  • 1970-01-01
  • 2012-04-26
  • 2012-11-09
  • 2013-02-10
  • 1970-01-01
  • 1970-01-01
  • 2017-01-26
  • 1970-01-01
相关资源
最近更新 更多