我有一个在PHP网站上运行的jQuery文件上传插件。
我想知道是否可以将文件上传到动态命名的子文件夹而不是全部进入同一个上传文件夹?
原因是我需要一个单独的文件夹,用于在网站上的用户创建的每个“项目”中上传的文件。例如。当用户创建项目时,他们为该项目上传的所有内容都进入/ uploads / {$ project_uid} / {$ file_name}
我希望我能够正确地解释自己,如果有人能帮助我,我会非常感激。
谢谢!
答案 0 :(得分:3)
Firt,显而易见的是:你 实际使用JavaScript / jQuery / jWhateverPlugin(即从客户端)设置上传目的地,明显的安全原因。
但您可以将信息传递到服务器端引擎(在您的情况下为PHP),这可能会使用它来管理上传的实际存储。
有各种各样的工具包可以帮助您,例如您最初开始使用的blueimp jQuery File Upload或Uploadify,Benno首次推出并且似乎符合您的要求。
因此,您需要做的是自定义客户端大小和服务器端脚本,以实现传递目录变量并使用它们来定义存储位置。
严重基于Uploadify documentation,并使用您的project_uid
变量,这看起来像这样:
在客户端(JavaScript + jQuery + Uploadify):
var project_uid;
// populate project_uid according to your needs and implementation
// befor using uploadify
$('#file_upload').uploadify({
'method' : 'post',
// pass your variable to the server
'formData' : { 'project_uid' : project_uid },
// optional "on success" callback
'onUploadSuccess' : function(file, data, response) {
alert('The file was saved to: ' + data);
}
});
在服务器端(PHP + Uploadify):
// Set $someVar to 'someValue'
$untrustedProjectUid = $_POST['project_uid'];
// Remember to check heavily the untrusted received variable.
// Let's pretend you checked it, it passe your tests, so you
// initialized a trusted var with it
$trustedProjectUid = ensureSecure( $untrustedProjectUid );
$targetFolder = '/uploads/' . $trustedProjectUid . '/' ; // Relative to the root
if (!empty($_FILES)) {
$tempFile = $_FILES['Filedata']['tmp_name'];
$targetPath = $_SERVER['DOCUMENT_ROOT'] . $targetFolder;
$targetFile = rtrim($targetPath,'/') . '/' . $_FILES['Filedata']['name'];
// Validate the file type
$fileTypes = array('jpg','jpeg','gif','png'); // Put you allowed file extensions here
$fileParts = pathinfo($_FILES['Filedata']['name']);
if (in_array($fileParts['extension'],$fileTypes)) {
move_uploaded_file($tempFile,$targetFile);
echo $targetFolder . '/' . $_FILES['Filedata']['name'];
} else {
echo 'Invalid file type.';
}
}