-1

问题:

当您使用该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
4

3 回答 3

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 个字符左右。

于 2013-05-13T21:06:35.890 回答
1

正如您在错误中看到的那样,$tmp_file是绝对路径。

要从该路径获取文件名,请使用basename($tmp_file).
http://nl1.php.net/manual/en/function.basename.php

$tmp_file = basename($_FILES['file_upload']['tmp_name']);
于 2013-05-13T21:06:50.520 回答
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

于 2013-05-13T21:16:33.887 回答