Php 移动上传的文件:不允许使用tmp文件名?

Php 移动上传的文件:不允许使用tmp文件名?,php,function,Php,Function,问题: 使用move\u uploaded\u file功能时,能否保留在tmp\u name中创建的名称?或者你必须总是把名字改成别的名字吗 如果可以将要移动的文件名保留为tmp_名称,那么必须如何传入参数?我尝试了以下代码,但似乎无法使其正常工作 请参阅下面的代码: if(isset($_POST['submit'])){ $tmp_file = $_FILES['file_upload']['tmp_name']; $target_file = basename($_FIL

问题:

使用
move\u uploaded\u file
功能时,能否保留在
tmp\u name
中创建的名称?或者你必须总是把名字改成别的名字吗

如果可以将要移动的文件名保留为tmp_名称,那么必须如何传入参数?我尝试了以下代码,但似乎无法使其正常工作

请参阅下面的代码:

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\u dir./“$target\u file传递时,似乎没有任何问题,但当我将其作为$upload\u dir./“$tmp\u file传递时,如上面的代码所示,它不断给我以下错误:

尖叫:已忽略对的错误抑制

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

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

正如您在错误
$tmp\u文件中所看到的,
是一个绝对路径

要从该路径获取文件名,请使用
basename($tmp\u file)


如前所述,您传递了错误的参数move_uploaded_file()的第一个参数必须是string filename,请尝试以下操作

extract(pathinfo($_FILES['file_upload']['tmp_name']));


if(move_uploaded_file($filename, $upload_dir."/".$tmp_file)){
    $message = "File uploaded successfully.";
}


我知道文件正在移动,我认为应该没有问题,因为我已经创建了一个变量:$tmp\u file=$\u FILES['file\u upload']['tmp\u name']。我设想我可以使用该变量作为move\u\u file()函数的第二个参数。哪里出错了?请尝试使用“$upload\u dir.”/“.basename($tmp\u文件)`$tmp\u文件是文件的完整路径。。。你只需要我想知道的名字你有没有试过输出
$tmp_file
$upload_dir./“$tmp_file
的实际值?我打赌你会得到类似于
上传\C:\wamp…
。啊,我明白了。我一直认为它已经给了我一个基本的名字。谢谢谢谢小心tmp_名称被重复使用,有时您会得到以前使用过的文件名。在移动上载之前,您需要仔细检查目标路径是否不存在,如果确实存在,请找出新路径。请参阅我的答案,了解一个简短的示例实现。这非常有用。如果它是文件的全名,而我上传的文件是jpg,它是否至少会作为jpg保存到临时文件中?或者它保存为tmp吗?正如@Orangepill所说,我想象我可以使用tmp_name的basename创建的名称。如果出于某种原因,他们将jpg更改为其他文件格式,我假设basename($tmp_name)不起作用。您可以读取
$\u FILES[]
数组,查看用户计算机上的文件名是否以“jpg”结尾,您可以查看他们的浏览器是否发送了mime类型的“image/jpeg”。但是,这两种方法都不可靠,有时它们不存在或不正确(特别是当有人试图入侵您的服务器时……但在非恶意情况下也是如此)。检查某个内容是否为有效jpeg的唯一可靠方法是干燥并将其绘制到屏幕上,或者至少通过某种图像处理工具运行它。我们通常将所有用户上传的图片调整为合理大小(假设他们可能上传一张1000万像素的照片)。如果调整大小失败,那么您就知道它不是jpg。每个服务器的临时位置都不同,系统管理员/托管公司必须决定将它们存储在哪里。通常,它位于每隔几天文件就会被删除的地方。PHP还会自动删除这些文件,这可能解释了为什么找不到它们。Wamp配置为将它们存储在
C:\Wamp\tmp
中。您应该使用
$\u文件['tmp\u name']
查找它们的存储位置。这将在每台服务器上都有效,但您必须立即将它们移动到其他位置,否则它们将被删除。到目前为止,我对第一个参数没有任何问题。你能进一步解释一下你的意思吗?
extract(pathinfo($_FILES['file_upload']['tmp_name']));


if(move_uploaded_file($filename, $upload_dir."/".$tmp_file)){
    $message = "File uploaded successfully.";
}