Closed fujianhai closed 4 years ago
erase 函数编译出错,提示没有匹配的类型。
稍等一下,我正准备看这个问题。希望在两三天之内解决,主要是我得搞一个 gcc 4.8.5 环境。
是这个地方的 erase 吗?
void ClientPool::Remove(const Key& key) {
clients_.erase(key); // ?
...
}
以及,CentOS 版本?
好的,谢谢, 我们的环境是centos 7.0 , gcc 4.8.5 g++ 4.8.5 , 一共有三个问题: 1、url.cc 343 line
void UrlQuery::Remove(const std::string &key) {
parameters_.erase(it)
}
第二: utility.cc 文件 std::string GetTimestamps() 函数 std::put_time () 这里
第三: common.cc 文件
codecvt 这个头文件不能用, std::codecvt_utf8
同时还有一个问题: example例子中 上传数据很慢,比如pdf文件, 速度很慢, 请问是什么问题?
是这个地方的 erase 吗?
void ClientPool::Remove(const Key& key) { clients_.erase(key); // ? ... }
以及,CentOS 版本?
7.0 当然 ubuntu的也可以,问题是一样的,一共上述3个问题,还是本地测试例子存在问题。
上传数据很慢,比如pdf文件, 速度很慢, 请问是什么问题? 同样大小的图片就很快 ?
上传数据很慢,比如pdf文件, 速度很慢, 请问是什么问题? 同样大小的图片就很快 ?
PDF 有多大?用 form 方式上传是没有串流的,能不能考虑改用直接的 POST/PUT?(book client 上传图书照片用了单独的 PUT),当然,如果你的 server 只有 form 方式上传那就没办法了。
其他几个编译问题改差不多了。
Edited: 一个 PDF 大概有几兆,发送前全部读到内存,然后 socket 没有分批写,这边有很大问题,需要串流分段读取文件分段发送。你不急的话,我回头研究一下。
void FormPart::Prepare(Payload* payload) {
using boost::asio::buffer;
if (data_.empty() && !path_.empty()) {
if (!utility::ReadFile(path_, &data_)) {
throw Error{ Error::kFileError, "Cannot read the file" };
}
}
方便的话,给我发邮件吧 (chunting.gu@outlook.com),我想了解一下你具体是怎么用的:server 的接口是什么形式?REST 还是 ?以及你现在是怎么集成到项目里的,是源代码集成还是先编译成静态库?
最后,编译错误初步改完了。Branch vs2013_compatible 也改名为更恰当的 legacy。
上传数据很慢,比如pdf文件, 速度很慢, 请问是什么问题? 同样大小的图片就很快 ?
PDF 有多大?用 form 方式上传是没有串流的,能不能考虑改用直接的 POST/PUT?(book client 上传图书照片用了单独的 PUT),当然,如果你的 server 只有 form 方式上传那就没办法了。
其他几个编译问题改差不多了。
Edited: 一个 PDF 大概有几兆,发送前全部读到内存,然后 socket 没有分批写,这边有很大问题,需要串流分段读取文件分段发送。你不急的话,我回头研究一下。
void FormPart::Prepare(Payload* payload) { using boost::asio::buffer; if (data_.empty() && !path_.empty()) { if (!utility::ReadFile(path_, &data_)) { throw Error{ Error::kFileError, "Cannot read the file" }; } }
PDF文件小的1M,最大的20M, 好的, book server例子您能跑吗? 在gcc 4.8.5 ,我们这里跑提示\\d+ 这个正则表达式有问题。您是否可以在gcc4.8.5上验证一下book的例子,我们试了一个1.2M的模型,就很慢了。 用的是 form_client的例子。 好的,辛苦您研究一下。
刚刚解决了你说的 regex 的问题,原因是 GCC 4.8 还没有完整支持 std::regex,所以我替换成了 boost::regex。 如果你还没有编译 boost::regex,需要先编译一下。然后 book server/client 跑起来就没有问题了。
运行 book_server:
$ ./book_server 9000 <path/to/upload>
<path/to/upload>
比如我用的是主目录:/home/adam
,book_server 收到上传的照片时,会创建一个子目录 books,图片会放在这个子目录。
运行 book_client:
$ ./book_client http://localhost:9000 <path/to/photo>
<path/to/photo>
比如我用的是 /home/adam/proj/webcc_legacy/examples/book_client/photo
。
因为这是示例程序,照片都是固定的。
上传照片的代码见:
bool BookClient::SetPhoto(const std::string& id, const bfs::path& path) {
try {
if (!CheckPhoto(path)) {
return false;
}
auto r = session_.Send(WEBCC_PUT(url_).
Path("books").Path(id).Path("photo").
File(path)());
if (!CheckStatus(r, webcc::Status::kOK)) {
return false;
}
return true;
} catch (const webcc::Error& error) {
std::cerr << error << std::endl;
return false;
}
}
这个函数往 URL /books/1/photo
PUT 了一张照片,指定的是照片的路径。其中 File(path)
第三个参数 chunk_size
指定了串流时每一次处理的数据大小,缺省为 1024 字节,如果文件较大或内存无所谓,可以设大一点,比如 1M 或更多。
最后,我更改了 examples, unittest 等输出目录统一到 <build dir>/bin
。
是否可以修改vs2013_compatible 在gcc 4.8.5上编译?