Когда я загружаю файлы, я использую функцию unique_id() PHP для имени файла, которое хранится на сервере (и я сохраняю расширение файла, так как это облегчает мне, когда я просматриваю все файлы в каталоге хранилища через локальную файловую систему).
Я сохраняю файл за пределами файловой системы сайта (иначе вы никогда не сможете напрямую просматривать файлы).
Я всегда использую функцию move_uploaded_file() php для сохранения файла на сервере.
Я сохраняю исходное имя файла, путь/имя файла, в котором он хранится, и любую другую связанную с проектом информацию, которая может потребоваться о том, кто ее загрузил и т. Д. В базе данных.
В некоторых моих реализациях я также создаю хэш содержимого файла и сохраняю его в базе данных. Затем с другими загруженными файлами посмотрите в базе данных, чтобы увидеть, есть ли у меня копия этого точного файла, который уже сохранен.
Некоторые примеры кода:
вид:
form method="post" enctype="multipart/form-data" action="your_form_handler.php">
<input type="file" name="file1" value="" />
<input type="submit" name="b1" value="Upload File" />
</form>
Форма обработчика:
<?php
// pass the file input name used in the form and any other pertinent info to store in the db, username in this example
_process_uploaded_file('file1', 'jsmith');
exit;
function _process_uploaded_file($file_key, $username='guest'){
if(array_key_exists($file_key, $_FILES)){
$file = $_FILES[$file_key];
if($file['size'] > 0){
$data_storage_path = '/path/to/file/storage/directory/';
$original_filename = $file['name'];
$file_basename = substr($original_filename, 0, strripos($original_filename, '.')); // strip extention
$file_ext = substr($original_filename, strripos($original_filename, '.'));
$file_md5_hash = md5_file($file['tmp_name']);
$stored_filename = uniqid();
$stored_filename .= $file_ext;
if(! move_uploaded_file($file['tmp_name'], $data_storage_path.$stored_filename)){
// unable to move, check error_log for details
return 0;
}
// insert a record into your db using your own mechanism ...
// $statement = "INSERT into yourtable (original_filename, stored_filename, file_md5_hash, username, activity_date) VALUES (?, ?, ?, ?, NOW())";
// success, all done
return 1;
}
}
return 0;
}
?>
Программа для обработки запросов на загрузку
<?php
// Do all neccessary security checks etc to make sure the user is allowed to download the file, etc..
//
$file = '/path/to/your/storage/directory' . 'the_stored_filename';
$filesize = filesize($file);
header('Content-Description: File Transfer');
header("Content-type: application/forcedownload");
header("Content-disposition: attachment; filename=\"filename_to_display.example\"");
header("Content-Transfer-Encoding: Binary");
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header("Content-length: ".$filesize);
ob_clean();
flush();
readfile("$file");
exit;
Если вы хотите представить загрузку в одной и той же странице, что пользователь запрашивает его из затем посмотрите на мой ответ на этот пост: Dowloading multiple PDF files from javascript
обычно отслеживать файлы, помещая путь и информацию о файле в таблицу базы данных. Что касается переименования, я только сделал переименование, чтобы убедиться, что имена файлов совместимы с ОС. Например, 'Cake Recipe.doc' имеет место в нем, linux действительно не любит разделенные имена файлов на линии commmand, поэтому, если вам нужно выполнить функции командной строки в файле, вам придется обернуть его в правильные кавычки, если вы не переименовали Это. –
Вы можете сохранить исходное имя и расширение в базе данных вместе с новым именем во время загрузки –
, подумайте о плохо разработанной системе, которая позволила бы кому-то загружать файлы '.php'.Если вы поместите файлы с предоставленным именем пользователя в корневой каталог вашего сайта, этот пользователь может теперь ПОЛНОСТЬЮ взять на себя ваш сервер, потому что они могут загружать и EXECUTE произвольный код на вашем сервере. –