我有这个恼人的问题:
下面你会看到我凌乱的上传脚本,每当我上传一个视频文件时,我都会使用md5函数来命名它,这样我的数据库/文件夹中就没有相同名称的视频文件了。
问题在于,当我多次将某个给定文件上传到数据库时,每次都会以相同的md5文件名存储它。如果你能帮助我修复这个小虫子,我真的很感激。我可能累了什么的。我尝试了一百种不同的解决方案,并没有修复它。
这是我的烂摊子:
<?php
class Upload_model extends CI_Model {
var $gallery_path;
var $videos_path;
var $thumbnail;
var $video_name;
var $upload_data;
var $file_name;
var $name;
var $videos_folder = "http://localhost/upload/videos/";
//////////////////////////////
function Upload_model() {
parent::__construct();
$this->videos_path = realpath(APPPATH . '..\videos');
// $this->returnFromDatabase();
}
function do_upload() {
$name = $_FILES['userfile']['name']; // get file name from form
$fileNameParts = explode(".", $name); // explode file name to two part
$fileExtension = end($fileNameParts); // give extension
$fileExtension = strtolower($fileExtension); // convert to lower case
$encripted_pic_name = md5($name) . "." . $fileExtension; // new file name
$config['file_name'] = $encripted_pic_name; //set file name
$config = array(
'allowed_types' => 'avi|mp4|flw|mov',
'upload_path' => $this->videos_path,
'file_name' => $encripted_pic_name
);
$this->load->library('upload', $config);
if ($this->upload->do_upload()) {
$this->upload_data = $this->upload->data(); //Returns array of containing all of the data related to the file you uploaded.
$this->file_name = $this->upload_data['file_name'];
$this->getThumbImage('C:\\xampp\\htdocs\\upload\\videos\\' . $encripted_pic_name);
$insert_data = array(
'name' => $encripted_pic_name,
'path' => 'C:\\xampp\\htdocs\\upload\\videos\\' . $encripted_pic_name,
'thumb_path' => 'C:\\xampp\\htdocs\\upload\\videos\\' . $encripted_pic_name . "_t.jpeg",
'uploaded_by' => 'admin'
);
$this->db->insert('videos', $insert_data); //load array to database
redirect('/welcome');
}
}
function getVideoInformation($videoPath) {
$movie = new ffmpeg_movie($videoPath, false);
$this->videoDuration = $movie->getDuration();
$this->frameCount = $movie->getFrameCount();
$this->frameRate = $movie->getFrameRate();
$this->videoTitle = $movie->getTitle();
$this->author = $movie->getAuthor();
$this->copyright = $movie->getCopyright();
$this->frameHeight = $movie->getFrameHeight();
$this->frameWidth = $movie->getFrameWidth();
$this->pixelFormat = $movie->getPixelFormat();
$this->bitRate = $movie->getVideoBitRate();
$this->videoCodec = $movie->getVideoCodec();
$this->audioCodec = $movie->getAudioCodec();
$this->hasAudio = $movie->hasAudio();
$this->audSampleRate = $movie->getAudioSampleRate();
$this->audBitRate = $movie->getAudioBitRate();
}
function getAudioInformation($videoPath) {
$movie = new ffmpeg_movie($videoPath, false);
$this->audioDuration = $movie->getDuration();
$this->frameCount = $movie->getFrameCount();
$this->frameRate = $movie->getFrameRate();
$this->audioTitle = $movie->getTitle();
$this->author = $movie->getAuthor();
$this->copyright = $movie->getCopyright();
$this->artist = $movie->getArtist();
$this->track = $movie->getTrackNumber();
$this->bitRate = $movie->getBitRate();
$this->audioChannels = $movie->getAudioChannels();
$this->audioCodec = $movie->getAudioCodec();
$this->audSampleRate = $movie->getAudioSampleRate();
$this->audBitRate = $movie->getAudioBitRate();
}
function getThumbImage($videoPath) {
$movie = new ffmpeg_movie($videoPath, false);
$this->videoDuration = $movie->getDuration();
$this->frameCount = $movie->getFrameCount();
$this->frameRate = $movie->getFrameRate();
$this->videoTitle = $movie->getTitle();
$this->author = $movie->getAuthor();
$this->copyright = $movie->getCopyright();
$this->frameHeight = $movie->getFrameHeight();
$this->frameWidth = $movie->getFrameWidth();
$capPos = ceil($this->frameCount / 4);
if ($this->frameWidth > 120) {
$cropWidth = ceil(($this->frameWidth - 120) / 2);
} else {
$cropWidth = 0;
}
if ($this->frameHeight > 90) {
$cropHeight = ceil(($this->frameHeight - 90) / 2);
} else {
$cropHeight = 0;
}
if ($cropWidth % 2 != 0) {
$cropWidth = $cropWidth - 1;
}
if ($cropHeight % 2 != 0) {
$cropHeight = $cropHeight - 1;
}
$frameObject = $movie->getFrame($capPos);
if ($frameObject) {
$imageName = $this->file_name . "_t.jpeg";
$tmbPath = "C:\\xampp\\htdocs\\upload\\videos\\" . $imageName;
$frameObject->resize(120, 90, 0, 0, 0, 0);
imagejpeg($frameObject->toGDImage(), $tmbPath);
} else {
$imageName = "";
}
return $imageName;
}
}
答案 0 :(得分:1)
md5在相同的字符串上使用时将始终返回相同的值,因此上传具有相同名称的文件将以相同的哈希结尾,将随机字符串添加到文件名
$encripted_pic_name = md5(microtime() . $name) . '.' . $fileExtension
您还需要注意md5()可能会发生冲突,其中两个不同的字符串将具有相同的输出。我不会为了你的需要而过分担心。
答案 1 :(得分:1)
重要的是,CI的上传类有一个名为encrypt_name
的属性。您可以将其设置为true,并在默认情况下加密文件名,而无需执行其他操作。看看:http://ellislab.com/codeigniter/user-guide/libraries/file_uploading.html
此外,由于您使用的是CI,请使用上传类,当CI提供的内容非常容易使用时,请不要自己编写。
答案 2 :(得分:0)
在md5之前,您需要在名称上添加一些随机字符(尽管即便如此,它仍然有可能重复名称)。
E.g:
$encripted_pic_name = md5($name . $randomStringHere) . "." . $fileExtension; // new file name
md5将始终为相同的输入提供相同的输出,因此如果您上传相同的文件两次,那么是,您已经使用了该哈希。
如果您只想要随机名称,那么您甚至不需要使用MD5,并且每次上传文件时都可以动态创建随机字符串(a,b,c等到z,然后是aa,ab,ac等等。)
答案 3 :(得分:0)
如果文件名相同,那么它将返回相同的md5 hash
为此,您必须encrypt
unique name or number
您可以使用
$encripted_pic_name = md5(strtotime()) . "." . $fileExtension; // new file name
或强>
$encripted_pic_name = md5(uniqid()) . "." . $fileExtension; // new file name