在上传到服务器之前重命名文件

时间:2014-10-23 14:52:30

标签: php file-upload

我试图创造某种自拍"手机上传者。现在它工作得很好只是当我在iPhone上测试上传文件时,所有照片都会被命名为image.jpeg,所以它们会互相覆盖。现在我要做的是重命名文件,让它说像image1.jpeg和下一个image2.jpeg,然后才能上传到服务器。

我目前的代码:

<?php
if (isset($_FILES['myFile'])) {
move_uploaded_file($_FILES['myFile']['tmp_name'], "uploads/" . $_FILES['myFile']    ['name']);
echo 'successful';
}
?>

我尝试使用此代码为图像提供图像的文件名值加上1到99999之间的随机数,但这并不成功。

<?php
if (isset($_FILES['myFile'])) {

$temp = explode(".",$_FILES["myFile"]["name"]);
$newfilename = rand(1,99999) . '.' .end($temp);
move_uploaded_file($_FILES["myFile"]["tmp_name"], "uploads/" . $newfilename;
echo 'successful';
}
?>

任何指针都将受到赞赏。

2 个答案:

答案 0 :(得分:2)

  

这不是一次成功。

不是描述错误的描述性方法。请包含PHP错误或自行调查,以便您(或我们)能够找出您的代码遇到的问题。有些编辑甚至会告诉你解析错误的位置。您也可以使用PHP linter。

错误在于这一行:

move_uploaded_file($_FILES["myFile"]["tmp_name"], "uploads/" . $newfilename;

move_uploaded_file函数缺少结束括号,因此您必须将其重新放入:

move_uploaded_file($_FILES["myFile"]["tmp_name"], "uploads/" . $newfilename);

我还建议使用更好的随机文件名生成器。尝试这样的事情:

$newfilename = sha1(uniqid(mt_rand(), true)) . '.' .end($temp);

它将创建一个has a much lower likelihood of collisions的散列(读取:2 in 160 。)

祝你好运!

答案 1 :(得分:0)

我认为你的方法不太正确。

在客户端重命名文件假定每个客户端都具有唯一的文件命名约定。但是,在实践中,如果不是很难实施,这将是不可能的。

但是,您可以更轻松地更改服务器上的文件命名约定。

<?php
if (isset($_FILES['myFile'])) {

$userid = 1; // User id loaded from database or some other way to identify user
$temp = explode(".",$_FILES["myFile"]["name"]);

// Create a distinct name for the file
$newfilename = $userid . '.' . date_timestamp_get() '.' .end($temp);

move_uploaded_file($_FILES["myFile"]["tmp_name"], "uploads/" . $newfilename);
echo 'successful';
}
?>

上述代码不是使用随机数生成器,而是根据用户的id,当前时间戳以及文件名确保唯一键。也可以使用其他变体,例如GUID。