За последние 24 часа нас посетили 58964 программиста и 1772 робота. Сейчас ищут 915 программистов ...

ajax multipart/form-data без HTML5

Тема в разделе "JavaScript и AJAX", создана пользователем Yadfewm, 30 июн 2010.

  1. Yadfewm

    Yadfewm Активный пользователь

    С нами с:
    20 июл 2009
    Сообщения:
    223
    Симпатии:
    0
    Конкретный вопрос: можно ли сформировать с помощью JavaScript запрос (POST) по протоколу HTML c Content-Type: multipart/form-data для отправки Файла?

    Пользовался поискoм, всего начитался, но до конца не могу разобраться.

    Вот что получается:
    Код (Text):
    1. req = new XMLHttpRequest();
    2. ...
    3. req.open("POST", url, true);
    4.  
    5. boundaryString = '1BEF0A57BE110FD467A',
    6. boundary = '--' + boundaryString,
    7. requestbody = '';
    8. requestbody += boundary + '\r\n'
    9.             + 'Content-Disposition: form-data; name="login"' + '\r\n'
    10.             + '\r\n'
    11.             + 'qq' + '\r\n'
    12.             + boundary + '\r\n'
    13.             + 'Content-Disposition: form-data; name="log"' + '\r\n'
    14.             + '\r\n'
    15.             + 'q' + '\r\n'
    16.             + boundary + '--' + '\r\n';
    17.  
    18. req.setRequestHeader("Content-type", 'multipart/form-data; boundary="' + boundaryString + '"  charset=windows-1251');
    19. req.setRequestHeader("Connection", "close");
    20. req.setRequestHeader("Content-length", requestbody.length);
    21. req.sendAsBinary(requestbody);
    В данном примере все работает (передача данных - не файла), но как только в данные попадают кирилические символы - запрос не работает, это связано (как мне кажется) с "метод не любит мультибайтовые кодировки" -> http://javascript.ru/blog/Brmaley.ee/FileAPI. Правиль я считаю?(кирилица - мультибайтовая кодировка?). Тогда можно использовать метод readAsBinaryString(string). Но почему он мне не доступен?: readAsBinaryString is not defined!

    PS 1) не хочу использовать фреймворки
    2) не хочу использовать iframe для загрузки файлов
     
  2. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    Yadfewm
    у вас и XMLHttpRequest не везде работать будет, его вы потом допиливать будите, потом обнаружите, что все что вы реализовали или пытаетесь реализовать, уже реализовано где то, а как думаете где можно посмотреть правильный вариант?
    правильно открываем фреймворк и смотрим =)
     
  3. Yadfewm

    Yadfewm Активный пользователь

    С нами с:
    20 июл 2009
    Сообщения:
    223
    Симпатии:
    0
    да, я полностью согласен, но =) :

    мой XMLHttpRequest немного подпилен, я просто не все выложил и поэтому работать будет более менее FF и последние IE, мне больше не нужно.

    фреймворк открывал ))) пробовал разобраться ) подумал я и закрыл

    На самом деле, если бы все было идеально, то формирование XMLHttpRequest - десяток строк. А вся жесть в количестве браузеров. А заливка файлов нужна только для меня в админке - пользователям нельзя, так что меня бы устроило и 10 строк вместо многокилобайтовых фреймворков.
     
  4. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    по моему тут вся логика в точности до наоборот должна быть, это пользователям вы должны были бы написать свое небольшое и легкое решение, а на страницу с админкой имеете доступ только вы...
     
  5. Yadfewm

    Yadfewm Активный пользователь

    С нами с:
    20 июл 2009
    Сообщения:
    223
    Симпатии:
    0
    К сожалению правда жизни такова, что Нет небольшого и легкого решения для пользователей, а есть фреймворки, а админка будет быстро летать, потому что админ обычно сидит обычно под "свежим" браузером, вообще хочу админку на HTML5 попробовать, давно пора, а сам сайт HTML4.01 strict..

    Да, кстати, проблема понемногу решается с помощью js функции
    Код (Text):
    1. encodeURIComponent('маша + даша')
    на стороне сервера соответственно

    Код (Text):
    1. foreach ($_POST as $key => $val) $_POST[$key] = rawurldecode($_POST[$key]);
    2. foreach ($_POST as $key => $val) $_POST[$key] = iconv('UTF-8', 'cp1251', $_POST[$key]);
    последняя строчка только в том случае если сайт на win-1251.

    На английском я не очень большой мастак читать, поэтому хорошо помогают разбираться в основах тут (кому интересно):
    http://javascript.ru/blog/Brmaley.ee/FileAPI
    http://www.codenet.ru/webmast/php/HTTP-POST.php
    http://xmlhttprequest.ru/#start
     
  6. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
  7. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Самый лучший сайт:
    http://www.javascriptkit.com/jsref/
     
  8. gkhelloworld

    gkhelloworld Активный пользователь

    С нами с:
    18 ноя 2007
    Сообщения:
    311
    Симпатии:
    0
    Адрес:
    PHP.ru
    Передача Файла по средствам jQuery (AJAX) простой пример с гибкими настройками
    http://valums.com/ajax-upload/

    если Вы хотите сделать красивую загрузку через ajax это то, что нужно...

    Код (Text):
    1. ПРОВЕРЕННО!
     
  9. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    gkhelloworld
     
  10. gkhelloworld

    gkhelloworld Активный пользователь

    С нами с:
    18 ноя 2007
    Сообщения:
    311
    Симпатии:
    0
    Адрес:
    PHP.ru
    я видел...но всё же ... если велосипед будет с 5 колёсами ...
     
  11. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    да ладно вам, можно это нормально реализовать самостоятельно
     
  12. gkhelloworld

    gkhelloworld Активный пользователь

    С нами с:
    18 ноя 2007
    Сообщения:
    311
    Симпатии:
    0
    Адрес:
    PHP.ru
    согласен... всё можно... но я бы подсказал был бы я гуру js :) так, что я просто подкинул идейку