问题:
使用move_uploaded_file
功能时,是否可以保留tmp_name
中创建的名称?或者你必须总是将名称更改为其他名称吗?
如果您可以将要移动的文件的名称保留为tmp_name,那么如何传递参数?我尝试了以下代码,似乎无法让它工作。
请参阅以下代码:
if(isset($_POST['submit'])){
$tmp_file = $_FILES['file_upload']['tmp_name'];
$target_file = basename($_FILES['file_upload']['name']);
$upload_dir = "uploads";
if(move_uploaded_file($tmp_file, $upload_dir."/".$tmp_file)){
$message = "File uploaded successfully.";
}else{
$error = $_FILES['file_upload']['error'];
$message = $upload_errors[$error];
}
}
当我在 $ upload_dir。“/”。$ target_file 中传递第二个参数时,似乎没有任何问题,但当我将其作为 $ upload_dir传递时。 “/".$ tmp_file ,如上面的代码所示,它一直给我以下错误:
SCREAM:
忽略错误抑制Warning: move_uploaded_file(uploads/C:\wamp\tmp\php1EA0.tmp): failed to open stream: Invalid argument in C:\wamp\www\bb2\uploads.php on line 26
答案 0 :(得分:5)
tmp_name
不是文件名,它是文件的完整路径。
如果您只想要一个随机文件名,我建议使用以下代码:
$dest = $_FILES['file_upload']['name'];
while (file_exists($dest)) {
$dest = $upload_dir . '/' . substr(sha1(rand()), 0, 10);
}
move_uploaded_file($_FILES['file_upload']['name'], $dest);
rand()
生成一个随机大数字。 sha1()
使用它作为种子来创建一个更大的随机十六进制字符串,我们不想要那么大的东西,所以只需抓住前10个字符左右。
答案 1 :(得分:1)
正如您在错误中看到的那样$tmp_file
是绝对路径。
要从该路径获取文件名,请使用basename($tmp_file)
http://nl1.php.net/manual/en/function.basename.php
$tmp_file = basename($_FILES['file_upload']['tmp_name']);
答案 2 :(得分:0)
正如已经提到的,你传递了错误的参数,move_uploaded_file()的第一个参数必须是字符串文件名试试这个
extract(pathinfo($_FILES['file_upload']['tmp_name']));
if(move_uploaded_file($filename, $upload_dir."/".$tmp_file)){
$message = "File uploaded successfully.";
}