尝试使用 HTTP/REST 服务器传输大文件时出现访问冲突错误
Access violation error while attempting to transfer a large file using HTTP / REST server
使用 REST
库,我试图将其设置为文件共享服务器,但在传输大文件时 运行 遇到问题。
据我了解,文件传输应该意味着打开文件流,在 stringstream
中获取其缓冲区,然后将其写入响应主体。这似乎适用于只有几个字节或 KB
的小文件,但任何更大的文件都会失败。
std::string filePath = "some_accessible_file";
struct stat st;
if(stat(filePath.c_str(), &st) != 0)
{
//handle it
}
size_t fileSize = st.st_size;
std::streamsize sstreamSize = fileSize;
std::fstream str;
str.open(filePath.c_str(), std::ios::in);
std::ostringstream sstream;
sstream << str.rdbuf();
const std::string str1(sstream.str());
const char* ptr = str1.c_str();
response.headers().add(("Content-Type"), ("application/octet-stream"));
response.headers().add(("Content-Length"), fileSize);
if (auto resp = request.respond(std::move(response))) //respond returns shared pointer to respond type
{
resp->write(ptr, sstreamSize ); //Access violation for large files
}
不太清楚为什么大文件会失败。文件类型有区别吗?我能够传输小文本文件等,但小 pdf 失败...
此错误的根本原因是 std::fstream
没有读取整个文件,因为它是以文本模式打开的。在 windows 中,这使得读取在文件结尾 (0x1A) 字符处停止。
解决方法是在 std::ios::binary
模式下打开文件。
使用 REST
库,我试图将其设置为文件共享服务器,但在传输大文件时 运行 遇到问题。
据我了解,文件传输应该意味着打开文件流,在 stringstream
中获取其缓冲区,然后将其写入响应主体。这似乎适用于只有几个字节或 KB
的小文件,但任何更大的文件都会失败。
std::string filePath = "some_accessible_file";
struct stat st;
if(stat(filePath.c_str(), &st) != 0)
{
//handle it
}
size_t fileSize = st.st_size;
std::streamsize sstreamSize = fileSize;
std::fstream str;
str.open(filePath.c_str(), std::ios::in);
std::ostringstream sstream;
sstream << str.rdbuf();
const std::string str1(sstream.str());
const char* ptr = str1.c_str();
response.headers().add(("Content-Type"), ("application/octet-stream"));
response.headers().add(("Content-Length"), fileSize);
if (auto resp = request.respond(std::move(response))) //respond returns shared pointer to respond type
{
resp->write(ptr, sstreamSize ); //Access violation for large files
}
不太清楚为什么大文件会失败。文件类型有区别吗?我能够传输小文本文件等,但小 pdf 失败...
此错误的根本原因是 std::fstream
没有读取整个文件,因为它是以文本模式打开的。在 windows 中,这使得读取在文件结尾 (0x1A) 字符处停止。
解决方法是在 std::ios::binary
模式下打开文件。