2016-05-06 11 views
1

Ich benutze Atmel SAM4E-EK Mikrocontroller als Server, wo eine Webseite erstellt wird und ich Daten über HTTP-Protokoll sende. Aber ich bin in der Download-Funktion stecken, wo ich versuche, eine Datei von meiner SD-Karte herunterladen die Datei wird nicht größer als 512 MB.Herunterladen von Dateien mit AJAX. Von einer SD-Karte.

static int cgi_Download_File(const char *name, char *recv_buf, size_t recv_len) 
{ 

    UNUSED(recv_buf); 
    UNUSED(recv_len); 
    UNUSED(name); 
    uint32_t length = 0; 
    int i; 
st = f_open(&file_logging, "Logging_File.csv",FA_OPEN_EXISTING | FA_READ); 


    for (i=0; i<; i++) 
    { 
     st = f_read(&file_logging, Buff_logging ,128 , &br); 

     sprintf((char *)tx_buf, 
     "{ \"Download_test\":\"%s\"}", 
      Buff_logging); 

     http_sendOk(HTTP_CONTENT_JSON); 
     http_write((char const *)tx_buf, strlen((char *)tx_buf)); 

    } 


} 

Der obige Code ist, wo ich die Datei bin Lesen der SD-Karte bilden und versuchen, sie über die HTTP-Protokoll an den Client zu senden. Ich kann nicht mehr als 12kb auf einmal lesen, weil ich meine ganze Erinnerung beschäftigt bin. Also teile ich die Datei in Pakete, also ist Buff_logging im Grunde mein Paket, das 512 Bytes ist.

Dies ist Form der Client-Seite, wo ich AJAX für den Download der Datei verwenden. Grundsätzlich versuche ich, die Pakete nacheinander in Reihenfolge zu bekommen und sie auf dem Client-Datenträger als CSV-Datei wiederherzustellen. Die Ajax-Funktion funktioniert nur für die ersten 512 Bytes, dann erhalte ich keine Pakete mehr.

Ich möchte erwähnen, dass ich keine Erfahrung mit Java HTML oder AJAX habe Ich bin mehr in Low-Level-Programmierung, aber ich werde die Hilfe zu mir sagen, wenn mein Code ein Potenzial hat oder dies der richtige Weg ist es zu tun.

+0

Können Sie die Dokumentation für http_sendOk und http_write/ – Musa

+0

verknüpfen Was meinst du genau? –

Antwort

0

Ich vermute, dass das Problem in der Schleife ist:

for (i=0; i<; i++) 
{ 
    ... 

    http_sendOk(HTTP_CONTENT_JSON); 
    http_write((char const *)tx_buf, strlen((char *)tx_buf)); 

} 

http_sendOk einen Content-Type-Header mit jedem gelesen werden, zu senden, aber die HTTP-Header kommen müssen, bevor die Antwort Körper und nur einmal vorkommen.

Ich bin nicht vertraut mit der Bibliothek, die Sie verwenden, aber die http_sendOk außerhalb der Schleife (initialisieren Sie einmal) und verlassen Sie die http_write innerhalb der Schleife (viele Datenpakete schreiben) könnte Ihr Problem beheben.

+0

Danke ssube! Aber das hat mir nicht geholfen Ich denke, mein Fehler ist der Kunde, weil ich wieder nur das erste Paket bekomme. –

+0

Es klingt wie 'http_sendOk' war nicht dein einziges Problem. Etwas schließt die Anforderung nach dem ersten "http_write", anstatt zuzulassen, dass die HTTP-Anforderung fortgesetzt wird, während Sie Daten dorthin streamen. Ich kann die Dokumentation für 'http_write' nicht finden, daher bin ich mir nicht sicher, was es tut. – ssube

0
void http_write(const char *buf, u32_t len)enter code here 
{ 
    g_hs->file = buf; 
g_hs->left = len; 

http_send_data(g_pcb, g_hs); 

/* 
* Tell TCP that we wish be to informed of buf that has been 
* successfully sent by a call to the http_sent() callback. 
*/ 
tcp_sent(g_pcb, http_sent); 
} 

Das ist die Funktion direkt die Bibliothek bilden .....

0

Ok, im Moment habe ich erreicht er Client übertragen Pakete, aber das hat nicht mein Problem ausräumen. Ich kann maximal 20 Pakete 2560 Bytes im Maximum senden, die ich in meinem Server speichern kann. Ist es möglich, eine Art von Strom Erste lesen 128b Form SD_card Datei Zweite senden an den Client über HTTP Third Kunde bekommt das Paket Vierte Packet ist das Herunterladen (Download-Prozess muss aufhören zu erreichen, wenn alle Pakete werden gesendet)

Ich habe die ersten 3 Schritte erreicht, also bitte kann mir jemand helfen, wie ich diesen stromeffekt erreichen kann.

Verwandte Themen