ExtJS4 — загрузка нескольких файлов и получение пути к файлу загруженных изображений после загрузки

Добрый день. Я создаю веб-приложение ExtJS4, и у меня есть часть, где я могу успешно загрузить несколько файлов в папку в моем файловом директоре. я использовал Библиотека Ивана Новакова для достижения этой цели.

Я создал кнопку, и в обработчике этой кнопки у меня был этот код:

var uploadPanel = Ext.create('Ext.ux.upload.Panel', {
uploader : 'Ext.ux.upload.uploader.FormDataUploader',
uploaderOptions : {
url : 'uploadGallery.php'
},
synchronous : true
});

var uploadDialog = Ext.create('Ext.ux.upload.Dialog', {
dialogTitle : 'My Upload Dialog',
panel : uploadPanel
});this.mon(uploadDialog, 'uploadcomplete', function(uploadPanel, manager, items, errorCount) {

console.log('manager = ' + manager);
console.log('items = ' + items);

console.log('manager result = ' + manager.result);
console.log('manager result message = ' + manager.message);
console.log('manager status = ' + manager.status);
console.log('manager filePath = ' + manager.filePath);

}, this);

uploadDialog.show();

У меня есть свой собственный обработчик загрузки файлов PHP как таковой:

<?php

require_once '_common.php';
$config = require_once '_config.php'; //require __DIR__ . '/_config.php';
$fileName = '';
$mimeType = '';
$fileSize = 0;

if (empty($_FILES)) {
_error('No file received');
}

$pathArray = array();

foreach ($_FILES as $fileName => $fileData) {

if (
!isset($fileData['error']) ||
is_array($fileData['error'])
) {
die(json_encode(array(
'success' => false,
'status' => "Invalid Parameters.",
'files' => $_FILES
)));
}

// Check $_FILES['fileToUpload']['error'] value.
switch ($fileData['error']) {
case UPLOAD_ERR_OK:
break;
case UPLOAD_ERR_NO_FILE:

die(json_encode(array(
'success' => false,
'status' => "No file sent.",
'files' => $_FILES
)));

case UPLOAD_ERR_INI_SIZE:
case UPLOAD_ERR_FORM_SIZE:
die(json_encode(array(
'success' => false,
'status' => "Exceeded filesize limit.",
'files' => $_FILES
)));

default:
die(json_encode(array(
'success' => false,
'status' => "Unknown errors.",
'files' => $_FILES
)));
}

// You should also check filesize here.
if ($fileData['size'] > 1000000) {
die(json_encode(array(
'success' => false,
'status' => "Exceeded File Size Limit.",
'files' => $_FILES
)));
}

// DO NOT TRUST $_FILES['fileToUpload']['mime'] VALUE !!
// Check MIME Type by yourself.
$finfo = new finfo(FILEINFO_MIME_TYPE);
if (false === $ext = array_search(
$finfo->file($fileData['tmp_name']),
array(
'jpg' => 'image/jpeg',
'png' => 'image/png',
'gif' => 'image/gif',
),
true
)) {
die(json_encode(array(
'success' => false,
'status' => "Invalid file format.",
'files' => $_FILES
)));

}

// You should name it uniquely.
// DO NOT USE $_FILES['fileToUpload']['name'] WITHOUT ANY VALIDATION !!
// On this example, obtain safe unique name from its binary data.
if (!move_uploaded_file(
$fileData['tmp_name'],
sprintf('./gallery/%s.%s',
basename($fileData['tmp_name']),
$ext
)
)) {
die(json_encode(array(
'success' => false,
'status' => "Failed to move uploaded file.",
'files' => $_FILES
)));

}
//          $uploadFile = sprintf('./gallery/%s.%s',
//              sha1_file($_FILES['fileToUpload']['tmp_name']);

$uploaddir = '/gallery/';
$name = $fileData["tmp_name"];

$fullPath = sprintf('gallery/%s.%s',
basename($fileData['tmp_name']),
$ext
);

array_push($pathArray, $fullPath);

//          echo '{"success": true, "status": "file Uploaded successfully", "filePath" : "$filePath"}';
//          _response(true, sprintf("%s", $fullPath));
//          echo(json_encode(array(
//              'success' => true,
//              'status' => "File is uploaded successfully.",
//              'filePath' => "$fullPath"//          )));
}
//_log(sprintf("[multipart] Uploaded %s, %s, %d byte(s)", $fileName, $mimeType, $fileSize));
// _response(true, $pathArray);

print_r(json_encode(array(
'success' => true,
'status' => "File is uploaded successfully.",
'filePath' => "$fullPath")));?>

Я не сильно изменил его _common.php а также _config.php который можно найти здесь.

Как вы можете видеть, в моей части PHP я пытаюсь отправить filePath загруженного файла обратно в часть ExtJS, мне это нужно для процесса ввода в базу данных. Однако я не знаю, как получить этот объект JSON обратно в мой код ExtJS, так как функция имеет только 4 аргумента (uploadPanel, manager, items, errorCount), и до сих пор мне не повезло, угадав, какой из них будет содержать JSON ответ.

Кто-нибудь может мне с этим помочь? Любая помощь очень ценится. Благодарю.

2

Решение

Я нашел довольно грубое решение этой проблемы. Что я сделал, так это то, что использовал исходные имена файлов, загруженных в качестве имен файлов в файловой системе сервера. Это НЕ хорошее решение. Если вам нужно сохранить имя файла в базе данных, а имя файла — SQL-инъекция, у вас будут проблемы.

// You should name it uniquely.
// DO NOT USE $_FILES['fileToUpload']['name'] WITHOUT ANY VALIDATION !!
// On this example, obtain safe unique name from its binary data.
move_uploaded_file(
$fileData['tmp_name'],
sprintf('./gallery/%s',
basename($fileData['name'])

В этом случае $_FILES['fileToUpload']['name'] является $fileData['name']проверь начало моего foreach петля.

Как уже упоминалось, вы не должны использовать $_FILES['fileToUpload']['name'] без проверки и валидации.

Этот вопрос все еще будет открыт для ответов.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]