Libevent::evhttp服务器下载

 

void http_handler_Get_Download(struct evhttp_request *req, void *arg)
{
    if (req == NULL)
    {
        return;
    }
    const char *uri = evhttp_request_get_uri(req);
    string strUrl(uri);

    string strFilePath = DPC::get_Url_path(strUrl, "path=");
    printf("FilePath = %s \n", strFilePath.c_str());

    string strFileName = DPC::get_FileName_path(strUrl, "/");
    strFileName = "attachment; filename=" + strFileName;

    //查看文件是否存在
    if (access(strFilePath.c_str(), 0) == -1)
    {
        evhttp_send_error(req, HTTP_BADREQUEST, 0);
        return;
    }
    //=========
    std::ifstream t;
    t.open(strFilePath.c_str(), ios::in | ios::binary);
    t.seekg(0, std::ios::end);
    long length = t.tellg();
    t.seekg(0, std::ios::beg);

    char *buffer = new char[length];
    t.read(buffer, length);
    t.close();

    char FileSize[10] = { '\0' };
    snprintf(FileSize, sizeof(FileSize), "%d", length);

    time_t timep;
    time(&timep);
    char s[50];
    sprintf(s, ctime(&timep));
    std::string strDate = std::string(s, s + (strlen(s) - 1));
    evhttp_add_header(evhttp_request_get_output_headers(req), "Server", "Unix");
    evhttp_add_header(evhttp_request_get_output_headers(req), "Content-Type", "application/octet-stream; charset=utf-8");
    evhttp_add_header(evhttp_request_get_output_headers(req), "Content-Disposition", strFileName.c_str());
    evhttp_add_header(evhttp_request_get_output_headers(req), "Content-Length", FileSize);
    evhttp_add_header(evhttp_request_get_output_headers(req), "Date", strDate.c_str());
    evhttp_add_header(evhttp_request_get_output_headers(req), "Connection", "close");
    //=========

    //回响应
    struct evbuffer *retbuff = NULL;
    retbuff = evbuffer_new();
    if (retbuff == NULL)
    {
        return;
    }
    evbuffer_add(retbuff, buffer, length);
    //evbuffer_add_printf(retbuff, "123");
    evhttp_send_reply(req, HTTP_OK, "Client", retbuff);
    evbuffer_free(retbuff);
}

 

转载于:https://www.cnblogs.com/osbreak/p/10247991.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值