C++ gsoap mime/dime 用于 Windows 中的二进制文件

标签 c++ binary mime gsoap

我快要失去理智了;)

我正在开发一项使用 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/

相关文章:

svg - Nginx 提供下载 SVG 而不是显示它

c++ - 使用 atan2 将 - 1 到 1 的范围转换为度数

c++ - 可以取地址的变量是左值,这是真的吗?

c++ - 为 iOS7 编译 BlueZ?

javascript - 为什么我的 JS 音频流代码在 x86 和 x86_64 系统上听起来不同?

php - 邮件正文中的 MIME 信息与 PHP

c++ - 如何防止过度打字

R CMD 安装 --build 包 --> "vignettes missing"

python - 在 Python 3 中删除字符串文字前面的 'b' 字符 do

android - 在 Android 中发送电子邮件仅选择电子邮件应用程序并指定附件 mime 类型