Blueimp jQuery File Upload plugin - "загрузка пустого файла" результат PHP
вот плагин:https://github.com/blueimp/jQuery-File-Upload
у меня проблема с получением ответа, который я хочу от плагина после загрузки файла.
на странице с плагином, у меня следующая
$('#fileupload').fileupload(
'option',
{
'maxNumberOfFiles' :1,
'url' : '/admin/upload_handler.php'
}
);
на upload_handler.php
Я успешно извлекаю загруженные файлы из $_FILES и делаю вещи, а затем отправляю ответ обратно в JSON. Я подтвердил с помощью Firebug, что ответ находится в правильном формат:
[
{
"url" : "image_url",
"thumbnail_url" : "image_th_url",
"delete_url" : "test",
"delete_type" : "DELETE",
"name" : "foobar.jpg",
"size" : 7419
}
]
но обратный вызов не может найти массив файлов, и я получаю сообщение об ошибке: "пустой результат загрузки файла". Я чувствую, что мне не хватает чего-то важного здесь-я не могу найти ничего в документах, форумах или переполнении стека. Я ценю любую помощь.
6 ответов
начиная с версии 5 плагина, ответ json изменился:https://github.com/blueimp/jQuery-File-Upload/wiki/JSON-Response
таким образом, у вас просто есть tweak ваш класс загрузки с:
$filejson = new stdClass();
$filejson->files[] = $fileArray;
return json_encode($filejson);
и вы сделали
ваш возврат должен быть заключен в массив файлов, например:
{"files": [
{
"name": "picture1.jpg",
"size": 902604,
"url": "http:\/\/example.org\/files\/picture1.jpg",
"thumbnailUrl": "http:\/\/example.org\/files\/thumbnail\/picture1.jpg",
"deleteUrl": "http:\/\/example.org\/files\/picture1.jpg",
"deleteType": "DELETE"
},
{
"name": "picture2.jpg",
"size": 841946,
"url": "http:\/\/example.org\/files\/picture2.jpg",
"thumbnailUrl": "http:\/\/example.org\/files\/thumbnail\/picture2.jpg",
"deleteUrl": "http:\/\/example.org\/files\/picture2.jpg",
"deleteType": "DELETE"
}
]}
в частности, требование: Note that the response should always be a JSON object containing a files array even if only one file is uploaded.
"пустой результат загрузки файла"будет происходить при добавлении объектов HTML (и в программном результате DOM) в шаблон, которые находятся вне
это приведет к правильной загрузке файлов, и для каждого загруженного файла вы получите" пустой результат загрузки файла " один раз.
похоже, что-то нужно сделать с шаблоном JS.
этот может быть исправлена в jquery.fileupload-ui, js, сразу после строки 128
исходный код:
// Callback for successful uploads:
done: function (e, data) {
var that = $(this).data('blueimp-fileupload') ||
$(this).data('fileupload'),
files = that._getFilesFromResponse(data),
template,
deferred;
if (data.context) {
data.context.each(function (index) { // LINE 128
var file = files[index] ||
{error: 'Empty file upload result'},
deferred = that._addFinishedDeferreds();
добавить следующий код после строки 128:
if (!$(data.context[index]).hasClass(that.options.uploadTemplateId)) { return true; }
результирующий код:
// Callback for successful uploads:
done: function (e, data) {
var that = $(this).data('blueimp-fileupload') ||
$(this).data('fileupload'),
files = that._getFilesFromResponse(data),
template,
deferred;
if (data.context) {
data.context.each(function (index) { //LINE 128
if (!$(data.context[index]).hasClass(that.options.uploadTemplateId)) { return true; } // YOUR ADDED LINE
var file = files[index] ||
{error: 'Empty file upload result'},
deferred = that._addFinishedDeferreds();
надеюсь, это поможет другим :)
хорошо, похоже, что это не проблема jQuery, а скорее проблема на стороне сервера. В моем случае это PHP-скрипт, который необходимо настроить следующим образом.
см. функцию post (), отредактируйте эту строку
$json = json_encode($info);
до
$json = json_encode(array($this->options['param_name'] =>$info));
и мне пришлось также изменить эхо в последней строке функции; вместо
echo $json;
там сейчас
echo str_replace('\/','/',$json);
похоже, что он отлично работает, возвращая правильный массив json. Надеюсь, это поможет.
в моем случае я изменил jquery.fileupload с-уй.JS-файл для прямого поиска результата JSON.
изменить этот фрагмент
if (data.context) {
data.context.each(function (index) {
var file = files[index] ||
{error: 'Empty file upload result'};//CHANGE
deferred = that._addFinishedDeferreds();
that._transition($(this)).done(
function () {
Этой
if (data.context) {
data.context.each(function (index) {
var file = data._response.result[index] ||
{error: 'Empty file upload result'};//TO THIS
deferred = that._addFinishedDeferreds();
that._transition($(this)).done(
function () {
Как упоминалось ранее, это происходит потому, что ответ сервера-это не то, что ожидает плагин (который является массивом файлы как показано здесь). Если вы не хотите (или не можете) изменить бэкэнд, решением является замена объекта результата в ответе на объект результата, который ожидает плагин (который затем содержит массив файлов).
Это можно сделать в fileuploaddone событие.
предположим, что это ответ JSON возвращается с сервера после завершения загрузки:
данные.результат удерживает ответ сервера:
.bind('fileuploaddone', function(e, data) {
//this will now contains the server response
//as per the attached image: an array of elements
data.result;
});
мы хотим заменить результат объект с новым, который может быть проанализирован плагином blueimp, давайте определим его (Примечание: это объект, который содержит массив файлов, согласно документам плагина).
//tempFolder is optional
var filesUploaded = { "files": [], "tempFolder": null };
замена объекта результат:
.bind('fileuploaddone', function(e, data) {
//creating a file object in the format the jquery plugin is expecting
var file = {
deleteType: "DELETE",
deleteUrl:"#",
type: data.result[0].MimeType,
thumbnailUrl : "#",
url: "#",
name: data.result[0].Name,
size: data.result[0].Size
}
//adding it to the file list
filesUploaded.files.push(file);
data.result = null;
//replacing the server response with the 'custom' one we just created
data.result = filesUploaded;
});
плагин теперь должен отображать хорошо, поскольку он будет анализировать ожидаемую схему JSON, и вы больше не получите сообщение "результат загрузки пустого файла".