[xhr][js] wysyłanie przez xhr wiadomości z Content-Type: multiple/mixed

0

"Chciałem napisać skrypt, który będzie potrafił wysłać fragment DOM mojej strony + jakieś inne informacje, np. obrazek. Podobno jest możliwość przerobienia obrazka na text. Podobna, bo u nie nie chce działać (obiekt FileReader).

W każdym razie mam problem ze sformułowaniem wiadomości do wysłania. W moim http request mają być dwie sekcje: application/x-www-form-urlencoded i application/octet-stream.

Kod funkcji, która to obsługuje wygląda tak:

function sendPage() {
    var source = document.getElementById("pageContainer")
    var serializer = new XMLSerializer
    if(!source.hasChildNodes()) {
	alert("nie ma nic do wysłania")
	return
    }
    var DOMNodeInString = "content="+escape(serializer.serializeToString(source))
//    sendToServer("savePage.php", true, handleAndShow, DOMNodeInString);return
    xhttp.open("POST", "savePage.php", true)
    var boundary = "xxx"
    var body = "--"+boundary+"\r\n"
    var file = document.getElementById("imgSource").files[0]
    //wysyłam obrazek
    if(file) {
	var reader = new FileReader()
	reader.readAsBinaryString(file)
	body += "Content-Disposition: form-data; name='upload'; filename='"+file.name+"'\r\n"
	body += "Content-Type: application/octet-stream\r\n\r\n"
	body += reader.result+"\r\n"
	body += "--"+boundary+"\r\n"
    }
    //wysyłam pozostałe pola formularza
    body += "Content-Type: multipart/x-www-form-urlencoded \r\n\r\n"
    body += DOMNodeInString
    body += "\r\n--"+boundary+"--"
    xhttp.setRequestHeader("Content-Type", "multipart/mixed; boundary="+boundary)
    xhttp.onreadystatechange = handleAndShow
    alert(body)
    xhttp.send(body)
} 

po stronie php:

 <?
header('Content-type: text/plain');

$output = DOMImplementation::createDocument(null, "root", DOMImplementation::createDocumentType("root", "", ""));
$output->encoding = 'UTF-8';

echo $_POST["content"];

?>

Przykładowe body mojego http request:

--xxx
Content-Disposition: form-data; name='upload'; filename='Wikipedia-logo-v2-en.png'
Content-Type: application/octet-stream


--xxx
Content-Type: multipart/x-www-form-urlencoded 

content=%3Cdiv%20id%3D%22pageContainer%22%20class%3D%22%22%3E%0A%20%20%3Cp%3Easdf%3C/p%3E%3C/div%3E
--xxx-- 

Niestety nie mogę odczytać $_POST["content"] - po prostu nic tam nie ma.

BTW. to co jest w content to zamieniony na string DOM Node przez XMLSerializer

Powiedzcie mi, co jest nie tak z moim zapytaniem? (a tak przy okazji, gdy FileReader nie chce działać to inaczej załadować img można tylko przez iframe?)"

0

Wysłałeś dwa razy taki sam nagłówek i do tego w środku dokumentu... Nagłówki są na górze. Liczy się bodajże pierwszy ciąg przed \n\r\n\r.

var reader = new FileReader()
reader.readAsBinaryString(file)

Na prawdę te dane tam są bezpieczne binarnie po takich zabawach? W ogóle weź mi przybliż jaki jest cel wysyłania obrazka z tego samego serwera POSTem do niego? Bo przecież cross-domain AJAXem się nie da...

0

nie interesowałem się filereaderem, ale czy przy pomocy tego można wyciągnąć zawartość binarną obrazka, który jest umieszczony w tagu img?
jeżeli tak to zrobisz protezę cross-domain ajax (mówię ogólnie, nie o tym przypadku) - tworzysz img z jakimśtam src
http://innadomena.pl/ajax.php?troche=parametrow&i_jeszcze=wiecej (wysylasz request)
i dane wracaja (niekoniecznie jako faktyczny obrazek, no ale skoro dałoby się przeczytać zawartość obrazka to już można sobie to porozbijać).

chyba, że o czymś nie wiem i to nie podziała?

0

@Demonical Monk: chciałem zrealizować coś takiego

 MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="frontier"

This is a message with multiple parts in MIME format.
--frontier
Content-Type: text/plain

This is the body of the message.
--frontier
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64

PGh0bWw+CiAgPGhlYWQ+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPHA+VGhpcyBpcyB0aGUg
Ym9keSBvZiB0aGUgbWVzc2FnZS48L3A+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==
--frontier--

źródło: http://en.wikipedia.org/wiki/MIME#Multipart_messages

Mógłbyś mi podpowiedzieć, co zmienić, aby szło coś takiego? Wydawało mi się, że ustawiam nagłówki w kolejności takiej jak powyżej i że wszystkie są potrzebne.
Czy dane są bezpieczne? No nie wiem, ale mam przykład, gdzie coś takiego się robi. To co prawda nowy standard (HTML5), ale chrome 7 i firefox 3.6 mają to obsługwać.
źródło: http://code.google.com/p/html5uploader/ i http://www.weeby.pl/blog/html5uploader/html5uploader.js

Wysyłanie danych binarnych powinno być możliwe tak czy inaczej bo: https://developer.mozilla.org/en/XMLHttpRequest#sendAsBinary(

Poza tym, to nawet jeżeli nie wysyłanie obrazka nie przejdzie, to chociaż chciałem doprowadzić do końca wysyłanie message multiple/mixed.

@dzek69: pewnie jakoś jest to ujęte w standardzie; o fileReader: https://developer.mozilla.org/en/DOM/FileReader

W każdym razie, jak należy napisać body i ustawić nagłówki?

1 użytkowników online, w tym zalogowanych: 0, gości: 1