move_uploaded_file:不允许使用tmp_name?

时间:2013-05-13 21:00:34

标签: php function

问题:

使用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

3 个答案:

答案 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.";
}

http://php.net/manual/en/function.move-uploaded-file.php

http://php.net/manual/en/function.extract.php