2010-10-15 174 views
22

我想從表單上傳一個doc文件併發送給電子郵件。我正在使用

$_FILES['file']['tmp_name']; 

問題是,它返回一個隨機生成的文件名。所以,當它到達收件箱時,文件名是phpvwRGKN.dat(文件名每次都是隨機的)。

如何保存文件名和擴展名?

注:我使用geekMail class

+20

dude print_r($ _ FILES); – rook 2010-10-15 19:22:49

回答

10

$_FILES["file"]["name"] - the name of the uploaded file

http://www.w3schools.com/php/php_file_upload.asp

+0

如果我使用$ _FILES [「file」] [「name」]並將它分配給一個變量,比如說$ attachment,它將不起作用,因爲它只返回一個文件名。我想我需要給路徑和路徑只能來自tmp_name。 如果我錯了,請糾正我。 – Jaspero 2010-10-15 19:21:27

+2

大多數郵件庫都有兩個用於附件的文件名。一個是服務器上文件的名稱/位置,另一個是您希望用戶看到它的名稱。在你的情況下,名稱/位置是'tmp_name',並且最終用戶文件名是'name'。 – 2010-10-15 19:26:48

+1

從你的問題我明白,你想通過使用名稱而不是tmp_name將文件存儲在服務器上。要做的事情是使用http:// php。net/manual/en/function.move-uploaded-file.php'move_uploaded_file()'並將'tmp_file'移動到名稱爲'name'的文件名。 – 2010-10-15 19:27:18

47

$_FILES['file']['tmp_name'];將包含服務器上的文件的臨時文件名。這只是您服務器上的佔位符,直到您處理文件

$_FILES['file']['name'];包含用戶計算機上傳文件的原始名稱。

+0

$ geekMail-> attach('/ home/willem/file2.zip')應該是使用庫的格式。 所以我不得不使用 $ attachment = $ _FILES ['file'] ['tmp_name']; $ geekMail-> attach($ attachment); 有沒有一種方法可以傳遞['name']以及路徑? – Jaspero 2010-10-15 19:24:37

+0

如果使用tmp_name的src創建img,會發生什麼情況? – Marcel 2014-07-17 13:47:51

+2

謝謝你解釋!無法在網絡上的任何位置找到該信息 – JMS 2014-11-14 19:24:53

0

只是一個建議,但你可以試試Pear Mail_Mime類。

http://pear.php.net/package/Mail_Mime/docs

否則,你可以使用一些代碼。使用rename()的Gabi Purcaru方法不會像寫入的方式那樣工作。看到這篇文章http://us3.php.net/manual/en/function.rename.php#97347。你需要像這樣:

$dir = dirname($_FILES["file"]["tmp_name"]); 
$destination = $dir . DIRECTORY_SEPARATOR . $_FILES["file"]["name"]; 
rename($_FILES["file"]["tmp_name"], $destination); 
$geekMail->attach($destination); 
1

像@Gabi Purcaru上面提到,重命名和移動文件是使用move_uploaded_file()的正確方法。它執行一些安全檢查以防止安全漏洞和其他漏洞。如果要使用它或從中派生的擴展名,則需要清理$_FILES['file']['name']的值。使用pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION)可以安全地獲取擴展名。

1

如果你想獲得上傳的文件名,使用$_FILES["file"]["name"]

但是,如果你想讀上傳的文件,你應該使用$_FILES["file"]["tmp_name"],因爲tmp_name的值是你上傳的文件的臨時副本,它比使用

容易

$_FILES["file"]["name"] // This name includes a file path, which makes file read process more complex

4

$_FILES["file"]["tmp_name"]包含文件內容的服務器上的實際副本,同時
$_FILES["file"]["name"]包含你從CLIEN上傳的文件名t電腦。