usver Posted December 21, 2008 Report Share Posted December 21, 2008 Kā no klienta puses skripta var nosūtīt binārus datus uz serveri, izmantojot xmlhttprequest.send() vai analogu metodi? Mēģinu nosūtīt binārus datus uz serveri, un tas daļēji arī sanāk - sūtīšana uzsākas ļoti veiksmīgi. Tikai sūtījums apraujas pie pirmā "\x00" simbola un ~50 baitu vietā tiek nosūtīti 17 baiti. valīdam pieprasījumam būtu jāizskatās aptuveni šādi: http://217.199.116.182/bin.png Tā kā serveris (https://tsa.e-me.lv/responder.eme) pieņem tikai un vienīgi bināru tekstu, tad diemžēl atkrīt tādi varianti kā base64_encode(), multipart/form-data un, iespējams, arī JSon, kas datus pa vidu pārveido. Tad nu meklēju metodi/bibliotēku, kas klienta pusē darbināmu Javascript/VBscript/JScript vai ActiveX kontrolu, lai varētu sūtīt binārus datus bez zudumiem. Iesakiet, lūdzu, risinājumu - tas var būt arī IE-only, pagaidām ar to pietiktu. :) kods ir aptuveni šāds: var url = "get_data.php"; var params = base64_decode(encoded); // te rodas bināri dati, kas tiešām arī ir bināri un nelasāmi http.open("POST", url, true); http.setRequestHeader("Content-type", "application/timestamp-query"); http.setRequestHeader("Content-length", params.length); http.setRequestHeader("Connection", "Keep-alive"); http.onreadystatechange = function() {//Call a function when the state changes. if(http.readyState == 4 && http.status == 200) { alert(http.responseText); } } http.send(params); Link to comment Share on other sites More sharing options...
marcis Posted December 21, 2008 Report Share Posted December 21, 2008 (edited) Kapēc tu viņus nevari sūtīt base64 sakodētus? EDIT: Ok, pārlasiju - nevari. Bet tieši šadu risinājumu parsti izmanto, lai nosūtītu binārus datus. Ar pašu php negribēji sūtīt? Edited December 21, 2008 by marcis Link to comment Share on other sites More sharing options...
Delfins Posted December 22, 2008 Report Share Posted December 22, 2008 bet tā arī vajadzētu pie 0x0 terminēties.. varbūt nepareizi garums tiek noteikts? un kāpēc ne-PHP ? Link to comment Share on other sites More sharing options...
Klez Posted December 22, 2008 Report Share Posted December 22, 2008 man arii liekas ka pratiigaak buutu suutiit to ajax savam php skriptam un lai php skripts suuta/sanjem tam e-me.lv datus. un tad nodod tos tavam ajax skriptam. Link to comment Share on other sites More sharing options...
usver Posted December 22, 2008 Author Report Share Posted December 22, 2008 būs jāmēģina caur VBScript noteikt garumu stringam, jo piem alert( params ) izvada vienkārši īsu stringu, nevis garu 50burtīgu - apraujas javascript,domājot, ka pie pirmā \x00 jābeidzas saturam un uzskata, ka tālāk nekā nav. JS pusē laikam problēma līdz ar to. Par parakstu - e-me vienkārši ir izdomājuši, ka pie viņiem drīkst vērsties tikai, autentificējoties ar e-paraksta smārtkarti un tikai tas cilvēks, kas grib kaut ko parakstīt. es nezinu iespēju, kā var piemānīt serveri, autentificējoties 3. personas vārdā, ja jāizmanto ar paroli aizsargāta privātā atslēga. līdz ar to PHP serveri, ko tādu mēģinot, sūta dillēs - "vai nu rādi šurp reālu e-parakstu, un mēs tevi atpazīsim, vai arī tinies!". vot, tāda jocīga sistēma tur - tikai baitus gan varēja netaupīt un base64_encoded datu pieņemšanu uztaisīt - lai arī papildus mazliet slodze atkodējot, tomēr vismaz no visurienes tas pakalpojums izmantojams un datu zudumi novēršas. Link to comment Share on other sites More sharing options...
marcis Posted December 22, 2008 Report Share Posted December 22, 2008 Neredzu problēmu, sūtīt datus ar php. fsockopen(); fputs(); fread(); Norādi attiecīgos header'us un viss bumbās. Link to comment Share on other sites More sharing options...
usver Posted December 22, 2008 Author Report Share Posted December 22, 2008 marcis: ar PHP protu nosūtīt - vienalga, ar curl, fsockopen() vai kaut vai wget izmantojot. tikpat labi varu sūtīt arī no Javas, to pastarpināti saucot ar PHP. Bet e-me visu sviež atpakaļ, ja vien HTTPS nav nodibināts ar derīgu Latvijas Pasta izdotu e-paraksta autentifikācijas sertifikātu. kuri glabājas tikai uz kartiņām un tikai klienta pusē. normāli LP serveris un parastais klients apmainās ar publiskajām atslēgām + lietotājs paraksta datus ar savu privāto atslēgu. ja kaut kas no tā iztrūkst, tad LP serveris sūta dillēs. Ja nebūtu šitās ņemtnes ar PIN aizsargātām atslēgām un HTTPS un viss ietu pa taisno no PHP, būtu kruta ;> bet viss ir sekjūri sataisīts, tik no Javaskripta tas ierobežojums, ka binārus datus no tā sūtīt kā stringu nav paredzēts :> skaic - tātad turpinu mēģināties ar VBscript izvirtībām. Link to comment Share on other sites More sharing options...
marrtins Posted December 22, 2008 Report Share Posted December 22, 2008 Bik patestējos. Ar trešo Firefoxi var šādi: if (window.XMLHttpRequest) xmlhttp = new XMLHttpRequest(); else if (window.ActiveXObject) xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); xmlhttp.open("POST", 'ajax.test.get.php', true); xmlhttp.onreadystatechange = ajax_status; var data = String.fromCharCode(13) + String.fromCharCode(27) + String.fromCharCode(0) + String.fromCharCode(1) + String.fromCharCode(2); xmlhttp.sendAsBinary(data); Parasts send arī darbotos, ja norādītu xmlhttp.setRequestHeader('Content-Length', data.length); // data.length=5 un tas suns (browseris), nepārrakstītu to Content-Length uz 2 (līdz String.fromCharCode(0)) Link to comment Share on other sites More sharing options...
usver Posted January 7, 2009 Author Report Share Posted January 7, 2009 Risinājums uz IE: vienkāršs, izrādās. var izmantot ADODB.Stream, un tas strādā :) Link to comment Share on other sites More sharing options...
Recommended Posts