最初に、明白なことを述べておく必要があります。明らかなセキュリティ上の理由から、JavaScript/jQuery/jWhateverPlugin を使用して (つまり、クライアント側から) アップロード先を実際に設定することはできません。
ただし、アップロードの実際のストレージを管理するために情報を使用するサーバー側エンジン (この場合は PHP) に情報を渡すことができます。
あなたが最初に始めた blueimp の jQuery File Upload や、Bennoが最初に宣伝して要件を満たしているように見えたUploadify など、さまざまなツールキットが役立ちます。
そのため、クライアント サイズとサーバー側の両方のスクリプトをカスタマイズして、ディレクトリ変数を渡し、それらを使用して格納場所を定義するように実装する必要があります。
Uploadify のドキュメントに大きく基づいており、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.';
}
}