你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

rt-thread中webclient使用

2021/12/17 9:25:45
  1. 文件传输
    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的代码
 *
 */