我快要失去理智了;)
我正在开发一项使用 gsoap 的服务。我想回复 mime 回应。
我一切正常,但是在读取二进制文件时,所有类型的文件(如 jpeg、pdf 等)...在数据上多次包含 \0
字符(如果用记事本打开可以看到很多NUL
)。
因此,一旦找到文件结尾字符,任何读取原始文件的代码都会严重失败。我尝试替换 \0
但文件显示不正确。
我也尝试了几种方法,包括gsoap自带的例子。
所以继续,
fstream 通用代码不起作用。
for (i = 0; i < MAX_FILE_SIZE; i++)
{ if ((c = fgetc(fd)) == EOF)
break;
image.__ptr[i] = c;
}
也不起作用
QFile::ReadAll
可以工作,但是当将 QString
转换为 char*
时,数组会在第一个 NUL
中被修剪>.
那么,读取整个二进制文件的最佳方法是什么?有时 C++ 的基础知识真是太疯狂了。
提前致谢。
我已经按照下面 retnick 的建议尝试了
UrlToPdf urlToPdf;
urlToPdf.getUrl(&input, &result);
QByteArray raw = urlToPdf.getPdf(QString(result.data.c_str()));
int size = raw.toBase64().size();
char* arraydata = new char[size];
strcpy(arraydata, raw.toBase64().data());
soap_set_mime(this, "MIME_boundary", NULL);
if(soap_set_mime_attachment(this, arraydata, size, SOAP_MIME_BASE64, "application/pdf", NULL, NULL, NULL))
{
soap_clr_mime(this);
soapMessage = this->error;
}
但运气不好... mime 响应比实际文件大...
大卫·奥尔特加
最佳答案
读取二进制文件使用 fread() 一旦您读取它,请将其视为字节数组而不是字符串。不允许使用字符串函数。
编辑:gSOAP documentation 14.1 节解释了如何发送 MIME 附件。我只引用相关函数(请全部阅读)。
int soap_set_mime_attachment(struct soap *soap, char *buf_ptr, size_t buf_size,
enum soap_mime_encoding encoding,
const char *type, const char *id,
const char *location, const char *description);
char *buf_ptr
是您的缓冲区。
size_t buf_size
是缓冲区的长度。
所以只需执行您的QFile::ReadAll
即可。
这会返回一个QByteArray
。 QByteArray 有方法
QByteArray QByteArray::toBase64 () const
这将返回一个
QByteArray base64image = QByteArray::toBase64(rawImage);
所以现在就做
soap_set_mime(soap, "MIME_boundary", "<<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="c0a2afb5aea4a1b2b9eeb8adac80aab5b3b4edb4a5b3b4a9aea7eea3afad" rel="noreferrer noopener nofollow">[email protected]</a>>");
/* add a base64 encoded image (base64image points to base64 data) */
soap_set_mime_attachment(soap,
base64image.data(), base64image.size(),
SOAP_MIME_BASE64, "image/jpeg",
"<<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="97f5f8e2f9f3f6e5eeb9fde7f2f0d7fde2e4e3bae3f2e4e3fef9f0b9f4f8fa" rel="noreferrer noopener nofollow">[email protected]</a>>", NULL, NULL);
我还没有测试过这个,但应该接近完成。
关于C++ gsoap mime/dime 用于 Windows 中的二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3088309/