Вход

Просмотр полной версии : как вернуть переменую в swfupload


ureech
01.05.2016, 12:24
Здравствуйте.Данный скрипт работает на сайте без аякса.Те после выбора файлов происходит перезагрузка для записи в базу.Хочу переделать на аякс, что бы сразу в базу не писалось, а просто выводилось на странице.Но не понимаю как вернуть файлы. Вот скрипт инициализации.
var swfu;
var uploadedCount = 0;

window.onload = function() {
var settings = {
flash_url: "/includes/swfupload/swfupload.swf",
upload_url: upload_url,
post_params: {"sess_id" : sess_id, "item_id" : item_id,"item_user" : item_user,"item_cat" : item_cat},
file_size_limit: "400 KB",
file_types: "*.jpg;*.png;*.gif;*.jpeg;*.JPG;*.PNG;*.GIF;*.JPEG",
file_types_description: "",

file_upload_limit : max_files,

file_queue_limit : 0,
custom_settings : {
progressTarget : "fsUploadProgress",
cancelButtonId : "btnCancel"
},
debug: false,

// Button settings
button_image_url: "/includes/swfupload/uploadbtn.png",
button_width: "80px",
button_height: "65px",
button_placeholder_id: "spanButtonPlaceHolder",

// The event handler functions are defined in handlers.js
file_queued_handler : fileQueued,
file_queue_error_handler : fileQueueError,
file_dialog_complete_handler : fileDialogComplete,
upload_start_handler : uploadStart,
upload_progress_handler : uploadProgress,
upload_error_handler : uploadError,
upload_success_handler : uploadSuccess,
upload_complete_handler : uploadComplete,
queue_complete_handler : queueComplete // Queue plugin event
};

swfu = new SWFUpload(settings);
};

function queueComplete(numFilesUploaded) {

if (numFilesUploaded>0){
// window.location.href = upload_complete_url;
}

}
Предположим ajax.php возвращает переменую или массив $file. Как мне её теперь вернуть на страницу, upload_complete_url, как я понимаю?

aklis
01.05.2016, 13:23
http://learn.javascript.ru/ajax-xmlhttprequest

Тут об AJAX. Все просто и доступно - делаем запрос, получаем ответ и обрабатываем его.
При прочтении этой темы у меня возникло впечатление что вы не в курсе что оно такое AJAX и как работает. Я так и не понял при чем тут ajax.php

laimas
01.05.2016, 14:35
ureech,
swfupload.swf как раз для асинхронной загрузки, хотя можно и пренебречь ею. Для современных браузеров это уже пережиток, они и без этого сами справляются.
А вот при успешной загрузке возвращаются не файлы, а либо теги изображений, либо только пути шлюзов для них, и поместив это на клиенте, можно получить изображения.

ureech
01.05.2016, 14:48
laimas,В этом и и было дело, что не понятно как на клиенте получить эти теги.Вроде нашёл решение, не знаю как будет работать, посмотрю.После обработки и загрузки фото в
function queueComplete(numFilesUploaded) {

if (numFilesUploaded>0){
// window.location.href = upload_complete_url;
}

}
передал аякс запросом что надо
function queueComplete(numFilesUploaded) {

if (numFilesUploaded>0){
$.post("/components/board/ajax/get_photo.php", {"user_id":item_user}, function(data) {
alert(data)
});
}
}
обработал и теперь на выходе имею имена файлов.

laimas
01.05.2016, 14:56
Вам не просто имена нужны, а пути на сервере куда они были загружены, ну или если загрузка постоянно в фиксированный каталог или же каталог перед операцией определен, то достаточно и имен, но с условием, что используются оригинальные имена, а не сервер их формирует при загрузке.
А уж по ним вывести изображения на клиенте, так какая тут может быть проблема?

ureech
01.05.2016, 16:06
laimas,
Всё верно. Проблема на данный момент в следующем.Имею на выходе
$.post("/components/board/ajax/get_photo.php", {"user_id":item_user}, function(data) {
document.getElementById('load').innerHTML= data;
});
строку со списком файлов.
. .. 1dfe4f3626dbce88db21157698e59009.jpg 2096a1c62e80c92fe47bb3e9b1618e77.jpg 394d20c2475c9529607fbe5fc7acd33a.jpg 4040d526d29405cb7d2e6b6ca7ace790.jpg 7e4082367c2ea4c26d556ad1afaf38ff.jpg 9481a0a7ff9742548f71ba3656c9a668.jpg a05e7aafcbef351885a8789d55aa078d.jpg b3c7778c6dab5ee7455deaec13d9c0b6.jpg f9b13106b167d7c17afe9fd94352001b.jpg
Не понимаю как мне их превратить в картинки. В том плане, что вставить имя в img src="" , получить нужное кол-во и превратить в какой то динамический список html, типа <ul><li>$file</li></ul>
Пробовал выводить в цикле, и формировать html,не выводит.

laimas
01.05.2016, 16:11
А зачем так передавать, лучше в JSON формате, хотя и эту полученную строку можно разбить по пробелу на массив:

data = data.split(' ');

но должна быть гарантия того, что пробел между именами один, до и после строки нет пробелов, иначе при формировании изображений проверять не пустое ли значение.

ureech
01.05.2016, 16:22
Пробовал, не работает.Не превращает в массив.

laimas
01.05.2016, 16:32
Пробовал, не работает.

Интересно как?

var s = '1dfe4f3626dbce88db21157698e59009.jpg 2096a1c62e80c92fe47bb3e9b1618e77.jpg 394d20c2475c9529607fbe5fc7acd33a.jpg 4040d526d29405cb7d2e6b6ca7ace790.jpg 7e4082367c2ea4c26d556ad1afaf38ff.jpg 9481a0a7ff9742548f71ba3656c9a668.jpg a05e7aafcbef351885a8789d55aa078d.jpg b3c7778c6dab5ee7455deaec13d9c0b6.jpg f9b13106b167d7c17afe9fd94352001b.jpg';

alert(s.split(' ')[3])

Да и строка, это не лучшее в данном случае. Во-первых где пути? Если путь у всех общий и известен, то нет проблем, а если нет? Или путь есть понятие динамическое? А гарантия, что все загрузились?

Ведь лучше же возвращать в JSON:

data = {
"msg" : //сообщение сервера по итогам
"path" : "path", //общий путь загруженных
"ims" : ["1dfe4f3626dbce88db21157698e59009.jpg", "2096a1c62e80c92fe47bb3e9b1618e77.jpg", ...], //успешно загруженные
"error" : //ошибки при загрузке и оригинальные имена не загруженных файлов
/// и т.д. и т.п....
}

ureech
01.05.2016, 16:45
Интересно как?
Так и пробовал.Всё равно строка,длинющая.
С путями и всем прочим порядок.
Ведь лучше же возвращать в JSON:
Согласен,но написанное вами мне не понятно.Как это получается?
И мне надо только имена файлов.Всё остальное готово и ждёт.:)

laimas
01.05.2016, 16:51
Так и пробовал.

Сомневаюсь что так или что данные были с разделителем пробелом, ну или тогда у вас эксклюзивный Javascript.

написанное вами мне не понятно.Как это получается?

Получается на сервере, вы же как-то впихнули имена в строку, а ведь $_EILES, это массив, и результат его обработки (загрузки) тоже будет массивом, а значит отдать клиенту массив, это json_encode(array). На клиенте это data = JSON.parse(data).

ureech
01.05.2016, 17:10
Сомневаюсь что так или что данные были с разделителем пробелом, ну или тогда у вас эксклюзивный Javascript.
Да, нет так и пробую.Я думаю дело в ф-ции swfupload.js
function queueComplete(numFilesUploaded) {, в которую помещён запрос.

laimas
01.05.2016, 17:15
Данная функция ожидает число numFilesUploaded, однако же вы показываете строку, якобы которую все таки получаете, и какие тогда проблемы?

Да и вообще, может в помойку этот swfupload? Ведь в свете HTML5 появились новые плагины для загрузки файлов, которые и для браузеров пенсионеров предоставляют возможности.

aklis
01.05.2016, 20:43
Хм, каким образом можно передать в AJAX какие-то данные без запроса со стороны клиента?