我试图创造某种自拍"手机上传者。现在它工作得很好只是当我在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';
}
?>
任何指针都将受到赞赏。
答案 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。