2012-03-23 26 views
17

Tôi đã tự hỏi liệu có thể thay đổi tên của tệp được tải lên hay không. Ý tôi là điều tôi đang cố gắng làm là, người dùng tải lên một tệp có thể có một số ký tự đặc biệt như ký tự đặc biệt bằng một số ngôn ngữ Châu Âu.Thay thế các ký tự đặc biệt trước khi tệp được tải lên bằng cách sử dụng PHP

Điều tôi định làm trước khi sử dụng lệnh move_uploaded_file là có thể thay đổi/preg_replace các ký tự đặc biệt với các ký tự bình thường, để tệp được tải lên và lưu trữ với tên mới chỉ có ký tự bình thường.

+0

Có thể, vâng. Bạn đã thử cái gì? –

Trả lời

26
// Get the original file name from $_FILES 
$file_name= $_FILES['file']['name']; 

// Remove any characters you don't want 
// The below code will remove anything that is not a-z, 0-9 or a dot. 
$file_name = preg_replace("/[^a-zA-Z0-9.]/", "", $file_name); 

// Get the location of the folder to upload into 
$location = 'path/to/dir/'; 

// Use move_uploaded_file() 
move_uploaded_file($_FILES["file"]["tmp_name"], $location.$file_name); 
+0

@ 472084, Bạn đã giải quyết được vấn đề quá lâu của tôi với các ký tự đặc biệt trong tệp Zip và trong các thư mục con hoặc tệp. Tuyệt quá. :) – NullPointer

+1

hoạt động tốt, nhưng bạn cũng phải thêm dấu chấm cho phần mở rộng của tệp. $ file_name = preg_replace ("/ [^ a-zA-Z0-9.] /", "", $ File_name); –

+0

nó hoạt động nhưng không thay đổi/đổi tên tên tệp trên vị trí đường dẫn – jned29

0

Bạn có thể lấy tên tập tin ban đầu cho một tập tin được tải lên từ $_FILES, và bạn có thể tạo phiên bản "đặc biệt" của bạn bằng cách thay thế các ký tự trong số đó bằng strtr (có vẻ phù hợp nhất với trường hợp này), str_replace, preg_replace hoặc bất kỳ chức năng xử lý chuỗi nào khác.

Cách tiếp cận tốt nhất tùy thuộc vào những gì chính xác bạn muốn thực hiện.

0

Bạn có thể làm điều đó như thế này, hãy viết một hàm đơn giản strip_special_chars() để thay thế ký tự mà bạn muốn trong một chuỗi

$tmp_name = $_FILES["file"]["tmp_name"]; 
$name = strip_special_chars($tmp_name); 
move_uploaded_file($name, "path/to/dir/"); 
+0

cảm ơn các bạn vì câu trả lời và mã ví dụ của bạn, đã giải quyết nó – 125369

0

Ngoài ra bạn có thể sử dụng một chức năng cho các ký tự đặc biệt như thế này:

function safename($theValue) 
{ 
    $_trSpec = array(
     'Ç' => 'C', 
     'Ğ' => 'G', 
     'İ' => 'I', 
     'Ö' => 'O', 
     'Ş' => 'S', 
     'Ü' => 'U', 
     'ç' => 'c', 
     'ğ' => 'g', 
     'ı' => 'i', 
     'i' => 'i', 
     'ö' => 'o', 
     'ş' => 's', 
     'ü' => 'u', 
    ); 
    $enChars = array_values($_trSpec); 
    $trChars = array_keys($_trSpec); 
    $theValue = str_replace($trChars, $enChars, $theValue); 
    $theValue=preg_replace("@[^A-Za-z0-9\-_.\/][email protected]","-",$theValue); 
    $theValue=strtolower($theValue); 
    return $theValue; 
} 

Hãy cẩn thận về cho phép. cho phần mở rộng tập tin.

Và sau đó thay đổi tên tập tin tạm thời ban đầu của bạn,

$tempFile = $_FILES['Filedata']['tmp_name']; 
$targetFile = safename($targetFile); 

$location = 'path/to/dir/'; 
move_uploaded_file($_FILES["file"]["tmp_name"], $location.$targetFile); 
Các vấn đề liên quan