Заморочки с отправкой файлов

M2
На сайте с 11.01.2011
Offline
342
603

Ребят, я заморочился!

В общем есть форма, в ней 7 полей. Среди этих полей есть поле для добавления фотографии. Причём реализовано динамическое добавление полей фоток. Т.е. юзер может таких полей хоть 100 нагенерить... Сама форма отправляется на сервак аяксом (jQuery). По завершению приходит флаг успешности или неуспешности вставки данных. Так вот, если данные вставлены успешно, то необходимо отправить фотки. Т.е.

1. Загрузить их в определённую папку.

2. Вставить фото в базу данных (пути к фото). Причём при вставке нужно понимать, что вставляется так же и id только что загруженного продукта. Т.е. я понимаю как бы, что файлы никак аяксом не отправить, но эти две компоненты должны быть связаны между собой. Ну или в ф-цию отправки фото аргументом передавать id только что загруженного продукта.

------------------- Крутые VPS и дедики. Качество по разумной цене ( http://cp.inferno.name/view.php?product=1212&gid=1 ) VPS25OFF - скидка 25% на первый платеж по ссылке выше
C
На сайте с 04.02.2005
Offline
277
#1
mark2011:
Т.е. я понимаю как бы, что файлы никак аяксом не отправить, но эти две компоненты должны быть связаны между собой.

Это где написано?

M2
На сайте с 11.01.2011
Offline
342
#2

Ну я же не могу прочитать массив $_FILES аяксом )))) про iframe понятно, но будет ли это кроссбраузерно? И потом я читал про ифрейм, мне-то нужно чтобы всё скопом отправилось, а не по одному файлику.

C
На сайте с 04.02.2005
Offline
277
#3
mark2011:
Ну я же не могу прочитать массив $_FILES аяксом )))) про iframe понятно, но будет ли это кроссбраузерно? И потом я читал про ифрейм, мне-то нужно чтобы всё скопом отправилось, а не по одному файлику.

Это почему же?

Оформить правильно заголовок <form> и будет счастье

M2
На сайте с 11.01.2011
Offline
342
#4


<form method="post" target="iframeID" enctype="multipart/form-data">

так что ли? но тогда ВСЯ форма будет слаться в iframeID.

Милованов Ю.С
На сайте с 24.01.2008
Offline
196
#5

Тэг форм, атрибут enctype - наводка.

А с загрузкой фоток можно поступить просто: после вставки в базу этих семи полей вызываем mysql_insert_id() и возврящаем его. Как тока мы получили АйДи этот - делаем его <input type="hidden" value="_stavim_zna4enie_4erez_jquery"> и будет красота.

Тока Вариант с хайден айди чуть-чуть небезопасный. Юзеры могут в исходном коде его спалить, да и вообще тупо отправить данные постом без добавления 7 полей.

Сорри за мысли в кучу. Пятница же:)

Подпись))
M2
На сайте с 11.01.2011
Offline
342
#6
Милованов Ю.С:
А с загрузкой фоток можно поступить просто: после вставки в базу этих семи полей вызываем mysql_insert_id() и возврящаем его. Как тока мы получили АйДи этот - делаем его <input type="hidden" value="_stavim_zna4enie_4erez_jquery"> и будет красота.

А что красота? По-вашему у меня форма не через iframe будет отправляться? Если так, то отправятся все поля, не только фото. Если нет, то как вы вообще видите отправку фото?

В чём "красота" я так и не понял)

C
На сайте с 04.02.2005
Offline
277
#7

mark2011, Чем отличается ajax-запрос, от обычного?

Причем здесь iframe?

M2
На сайте с 11.01.2011
Offline
342
#8

При том, что файлы ajax-запросом физически отправиться не могут!

если это не так, пример кода, иллюстрирующего ваши слова - в студию!

C
На сайте с 04.02.2005
Offline
277
#9
mark2011:
При том, что файлы ajax-запросом физически отправиться не могут!
если это не так, пример кода, иллюстрирующего ваши слова - в студию!

http://en.dklab.ru/lib/JsHttpRequest/

Это, даже не гуглив...

M2
На сайте с 11.01.2011
Offline
342
#10

В общем, накодил вот что:

Это вот функции, которые успешно работают на одном сайте:


function file_send() {
sendForm("send", "/admin/includes/copyfile.php", callback);
return false;
}

function photo_send() {
sendForm("addProduct", "includes/load_photo.php", callbackPhoto);
return false;
}
function sendForm(form, url, callfunc) {
if (!document.createElement) return;
if (typeof(form)=="string") form=document.getElementById(form);
var frame=createIFrame();
var act = form.getAttribute('action');
frame.onSendComplete = function() {callfunc(form,act,getIFrameXML(frame));};
form.setAttribute('target', frame.id);
form.setAttribute('action', url);
form.submit();
}

function createIFrame() {
var id = 'frameID';
var div = document.createElement('div');
div.innerHTML = "<iframe style=\"display:none;\" src=\"about:blank\" id=\""+id+"\" name=\""+id+"\" onload=\"sendComplete('"+id+"')\"></iframe>";
document.body.appendChild(div);
return document.getElementById(id);
}

function sendComplete(id) {
var iframe=document.getElementById(id);
if (iframe.onSendComplete &&
typeof(iframe.onSendComplete) == 'function') iframe.onSendComplete();
}

function getIFrameXML(iframe) {
var doc=iframe.contentDocument;
if (!doc && iframe.contentWindow) doc=iframe.contentWindow.document;
if (!doc) doc=window.frames[iframe.id].document;
if (!doc) return null;
if (doc.location=="about:blank") return null;
if (doc.XMLDocument) doc=doc.XMLDocument;
return doc;
}

function callback(form,act,doc) {
form.setAttribute('action', act);
form.removeAttribute('target');
alert(doc.body.innerHTML);
}

function callbackPhoto(form,act,doc)
{
form.setAttribute('action', act);
form.removeAttribute('target');

//$('results').set('html', doc.body.innerHTML);
//location.reload();
}

далее сделал так:

(фрагмент кода)


<iframe name="upload_target" style="width:0;height:0;"></iframe>
<div class="formcontent">
<form id="addProduct" name="addProduct" class="form-horizontal" target="upload_target">

Но остаются неясными два вопроса:

1. Откуда берётся файл load_photo.php? От какого корня считается этот путь?

2. Создал 2 файла load_photo.php в разных папках (авось какой-нибудь сработает!). с одинаковым содержанием:


print_r($_FILES);

с надеждой увидеть весь массив...

Форма просто даже не отрабатывает, а непонятно что делает... мне даже не удаётся по Firebug отследить, на какие файлы идёт запрос (если вообще куда-то идёт).

---------- Добавлено 25.01.2013 в 14:11 ----------

Не пойму, в чём я не догоняю....

Все те функции, указанные в этом посте - работают.

На форме установлен enctype=multipart/form-data

Файл-обработчик php вызывается! проверено...

При попытке вывести содержимое ответа (массив $_FILES) выводится просто пустой массив...

На всякий случай дублирую:


<iframe name="upload_target" style="width:0;height:0;"></iframe>
<div class="formcontent">
<form id="addProduct" name="addProduct" class="form-horizontal" target="upload_target" enctype="multipart/form-data">

Callback-функция


function callbackPhoto(form,act,doc)
{
form.setAttribute('action', act);
form.removeAttribute('target');
$('#result').html(doc.body.innerHTML);
//$('results').set('html', doc.body.innerHTML);
//location.reload();
}

php:


print_r($_FILES);

на выходе ТУПО пустой массив...

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий