- 文件传输
1.1文件下载
int webclient_get_file(const char* URI, const char* filename);
/*
* 参数说明: URI 地址 filename 文件名 注意 URI后一定要具体到某个文件,不能光是路径,一定要带文件名, filename 也要带路径
*/
1.2 文件上传
文件上传采用表单方式,有的需要带路径,有的不需要
int webclient_post_file1(const char* URI, const char* filename,
const char* form_data, const char* form_data1)
{
size_t length;
char boundary[60];
int fd = -1, rc = WEBCLIENT_OK;
char *header = RT_NULL, *header_ptr;
unsigned char *buffer = RT_NULL, *buffer_ptr;
unsigned char *buffer1 = RT_NULL, *buffer_ptr1;
struct webclient_session* session = RT_NULL;
int resp_data_len = 0;
fd = open(filename, O_RDONLY, 0);
if (fd < 0)
{
LOG_D("post file failed, open file(%s) error.", filename);
rc = -WEBCLIENT_FILE_ERROR;
goto __exit;
}
/* get the size of file */
length = lseek(fd, 0, SEEK_END);
lseek(fd, 0, SEEK_SET);
buffer = (unsigned char *) web_calloc(1, WEBCLIENT_RESPONSE_BUFSZ);
if (buffer == RT_NULL)
{
LOG_D("post file failed, no memory for response buffer.");
rc = -WEBCLIENT_NOMEM;
goto __exit;
}
buffer1 = (unsigned char *) web_calloc(1, WEBCLIENT_RESPONSE_BUFSZ);
if (buffer1 == RT_NULL)
{
LOG_D("post file failed, no memory for response buffer.");
rc = -WEBCLIENT_NOMEM;
goto __exit;
}
header = (char *) web_calloc(1, WEBCLIENT_HEADER_BUFSZ);
if (header == RT_NULL)
{
LOG_D("post file failed, no memory for header buffer.");
rc = -WEBCLIENT_NOMEM;
goto __exit;
}
header_ptr = header;
/* build boundary */
rt_snprintf(boundary, sizeof(boundary), "----------------------------%012d", rt_tick_get());
/* build encapsulated mime_multipart information*/
buffer_ptr = buffer;
/* first boundary */
buffer_ptr += rt_snprintf((char*) buffer_ptr,
WEBCLIENT_RESPONSE_BUFSZ - (buffer_ptr - buffer), "--%s\r\n", boundary);
buffer_ptr += rt_snprintf((char*) buffer_ptr,
WEBCLIENT_RESPONSE_BUFSZ - (buffer_ptr - buffer),
"Content-Disposition: form-data; %s\r\n", form_data);
buffer_ptr += rt_snprintf((char*) buffer_ptr,
WEBCLIENT_RESPONSE_BUFSZ - (buffer_ptr - buffer),
"Content-Type: text/csv\r\n\r\n"); //"Content-Type: application/octet-stream\r\n\r\n");
/* second boundary */
buffer_ptr1 = buffer1;
buffer_ptr1 += rt_snprintf((char*) buffer_ptr1,
WEBCLIENT_RESPONSE_BUFSZ - (buffer_ptr1 - buffer1), "--%s\r\n", boundary);
buffer_ptr1 += rt_snprintf((char*) buffer_ptr1,
WEBCLIENT_RESPONSE_BUFSZ - (buffer_ptr1 - buffer1),
"Content-Disposition: form-data; %s\r\n", form_data1);
/* calculate content-length */
length += buffer_ptr - buffer;
length += buffer_ptr1 - buffer1;
length += rt_strlen(boundary) + 8; /* add the last boundary */
/* build header for upload */
header_ptr += rt_snprintf(header_ptr,
WEBCLIENT_HEADER_BUFSZ - (header_ptr - header),
"Content-Length: %d\r\n", length);
header_ptr += rt_snprintf(header_ptr,
WEBCLIENT_HEADER_BUFSZ - (header_ptr - header),
"Content-Type: multipart/form-data; boundary=%s\r\n", boundary);
session = webclient_session_create(WEBCLIENT_HEADER_BUFSZ);
//webclient_header_fields_add(session, "Content-Type: application/octet-stream\r\n");
if(session == RT_NULL)
{
rc = -WEBCLIENT_NOMEM;
goto __exit;
}
rt_strncpy(session->header->buffer, header, rt_strlen(header));
session->header->length = rt_strlen(session->header->buffer);
rc = webclient_post(session, URI, NULL);
if(rc < 0)
{
goto __exit;
}
/* send mime_multipart */
webclient_write(session, buffer1, buffer_ptr1 - buffer1);
webclient_write(session, buffer, buffer_ptr - buffer);
/* send file data */
while (1)
{
length = read(fd, buffer, WEBCLIENT_RESPONSE_BUFSZ);
if (length <= 0)
{
break;
}
webclient_write(session, buffer, length);
}
/* send last boundary */
rt_snprintf((char*) buffer, WEBCLIENT_RESPONSE_BUFSZ, "\r\n--%s--\r\n", boundary);
webclient_write(session, buffer, rt_strlen(boundary) + 8);
extern int webclient_handle_response(struct webclient_session *session);
if( webclient_handle_response(session) != 200)
{
rc = -WEBCLIENT_ERROR;
goto __exit;
}
resp_data_len = webclient_content_length_get(session);
if (resp_data_len > 0)
{
int bytes_read = 0;
rt_memset(buffer, 0x00, WEBCLIENT_RESPONSE_BUFSZ);
do
{
bytes_read = webclient_read(session, buffer,
resp_data_len < WEBCLIENT_RESPONSE_BUFSZ ? resp_data_len : WEBCLIENT_RESPONSE_BUFSZ);
if (bytes_read <= 0)
{
break;
}
resp_data_len -= bytes_read;
} while(resp_data_len > 0);
}
__exit:
if (fd >= 0)
{
close(fd);
}
if (session != RT_NULL)
{
webclient_close(session);
}
if (buffer != RT_NULL)
{
web_free(buffer);
web_free(buffer1);
}
if (header != RT_NULL)
{
web_free(header);
}
return rc;
}
int wpost(int argc, char** argv)
{
char form_data[] = "name=\"file\";filename=\"ltg.csv\""; // 根据实际改
char form_data1[] = "name=\"path\"\r\n/data/csv/76/\r\n"; // 根据实际改
char url[] = "http://m2m.feisjy.com/substation/substationNeutralManagement/deleteFile"; // 根据实际改
char file_name[] = "ltg.csv"; // 根据实际改
rt_tick_t t1 = rt_tick_get();
webclient_post_file1(url, file_name, form_data, form_data1);
rt_tick_t t2 = rt_tick_get();
rt_kprintf("run time is %u\n", t2 -t1); // 文件发送时间,单位毫秒
return 0;
}
/*
* 在测试中发现,有的表单使用cgi处理,这样可以不用带path,带path要加一个boundary,官方例程没有这个boundary,上面代码是增加后的带path的代码
*
*/
