2013-05-13 72 views
-2

问题:move_uploaded_file:不允许使用tmp_name?

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

我知道该文件正在被移动,并且我认为自从我创建以来不应该有任何问题一个变量已经:$ tmp_file = $ _FILES ['file_upload'] ['tmp_name']。我想我可以使用该变量作为move_uploaded_file()函数中的第二个参数。我哪里错了? – 2013-05-13 21:02:21

+1

尝试使用'$ upload_dir。“/”。basename($ tmp_file)'$ tmp_file是该文件的完整路径...您只需要我假设的名称 – Orangepill 2013-05-13 21:05:31

+0

您是否尝试过输出实际值'$ tmp_file'和'$ upload_dir。“/”。$ tmp_file'?我敢打赌,你会得到像'uploads \ C:\ wamp ...'这样的东西。 – likeitlikeit 2013-05-13 21:06:13

回答

4

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

+0

这是非常有帮助的。如果它是该文件的全名,并且我上传的文件是jpg,那么至少是否将它保存为临时文件作为jpg?还是保存为tmp? – 2013-05-13 21:09:41

+0

正如@Orangepill所说,我想我可以使用tmp_name的基名创建的名称。如果由于某些原因,他们将jpg更改为某种其他文件格式,我假设basename($ tmp_name)不起作用 – 2013-05-13 21:11:04

+1

您可以阅读'$ _FILES []'数组以查看用户计算机上的文件名是否以“ jpg“,你可以看到他们的浏览器是否发送了MIME类型的”image/jpeg“。然而,这两种方法都不可靠,有时候它们不会存在或者会不正确(特别是当有人试图破解你的服务器时......而且在非恶意的情况下)。 – 2013-05-13 21:20:48

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

+0

到目前为止,我对第一个参数没有任何问题。你能解释一下你的意思吗? – 2013-05-13 21:18:48