我使用Atmel SAM4E-EK微控制器作为创建网页的服务器,我通过HTTP协议发送数据。但我陷入下载功能,我试图从我的sd_card下载文件,文件不会超过512MB。
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));
}
}
以上代码是我从sd卡读取文件并尝试通过HTTP协议将其发送到客户端的地方。我一次读不到12kb,因为我占据了我的全部记忆。所以我将文件分成包,所以基本上Buff_logging是我的包,它是512字节。
$(function() {
$("button").click(function() {
$.ajax({
url: "get_Download_File",
type: "GET",
dataType: 'json',
success: function(result) {
var url = URL.createObjectURL(result);
var $a = $('Download_test', {
'href': url,
'download': 'document.csv',
'text': "click"
}).hide().appendTo("body")[0].click();
setTimeout(function() {
URL.revokeObjectURL(url);
}, 10000);
}
});
});
});
这是客户端,我正在使用AJAX进行文件下载。基本上我在这里尝试实现的是按顺序逐个获取包,并将它们作为csv文件在客户端磁盘中恢复。 ajax函数仅适用于前512个字节,然后我不再收到任何数据包。
我想提一下我没有Java HTML或AJAX的经验我更喜欢低级编程,但我很感激帮助告诉我,如果我的代码有潜力或者这是正确的方法做到这一点。
答案 0 :(得分:0)
我怀疑问题出在你的循环中:
for (i=0; i<; i++)
{
...
http_sendOk(HTTP_CONTENT_JSON);
http_write((char const *)tx_buf, strlen((char *)tx_buf));
}
http_sendOk
将在每次读取时发送内容类型标头,但HTTP标头必须位于响应正文之前,并且只发生一次。
我不熟悉你正在使用的库,但是将http_sendOk
移到循环之外(初始化一次)并将http_write
留在循环中(写入许多数据包)可能会解决你的问题。
答案 1 :(得分: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);
}
这是函数直接形成库.....
答案 2 :(得分:0)
好的,目前我已经实现了将数据包传输到客户端,但这并没有解决我的问题。我可以发送最多20个数据包2560字节,我可以存储在我的服务器中。 是否有可能实现某种流 首先读取128b格式的SD_card文件 第二次通过HTTP发送给客户端 第三客户端获取包 第四正在下载数据包(下载过程必须在发送所有数据包时停止)
我已经完成了前3个步骤,所以请有人帮助我如何实现流效果。