背景:java端基於webservice實現服務端,c作爲客戶端,通過gsoap傳輸圖片給服務端。
實現步驟:
1、c端通過服務端wsdl文件生成客戶端代碼,圖片接收部分的結構體如下:
struct xsd__base64Binary{
unsigned char *__ptr;
int __size;
char *id; /* optional element of type xsd:string */
char *type; /* optional element of type xsd:string */
char *options; /* optional element of type xsd:string */
};
2、讀取圖片數據,並賦值給次結構體
merchantLogoByte.__ptr = soap_malloc( &add_soap, size);
memcpy(merchantLogoByte.__ptr, data, size); //data 圖片數據
merchantLogoByte.__size = size; //size圖片大小
3、代碼示例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "AppWebServiceSoapBinding.nsmap"
#include "soapH.h"
#include "soapStub.h"
#define BUFSIZE 10240
/****************************************************************
函數說明 :pos簽到
入口參數 :mbs數據結構體
返回類型 :交易結果
0-成功
非0-失敗
初始時間 :2014-9-18 yuweichao
修改記錄 :
用途功能 :用於去後臺校驗版本信息、生成POS機一級菜單。
****************************************************************/
int main ()
{
struct soap add_soap;
struct ns3__AddMerchantRequest _request;
struct ns4__spWSProcessRegistResponse _param_7;
struct xsd__base64Binary merchantLogoByte;
char aRcvmsg_buf[BUFSIZE];
char aTmp[256] = {0};
memset(&_request, 0x00, sizeof(struct ns3__AddMerchantRequest));
memset(&_param_7, 0x00, sizeof(struct ns4__validateAdminTelCellNumResponse));
memset(&merchantLogoByte, 0x00, sizeof(struct xsd__base64Binary));
// sleep(10);
printf("交易處理開始 \n");
soap_init (&add_soap);
soap_set_mode(&add_soap,SOAP_C_UTFSTRING); /*設置字符集,要不客戶端及服務端都會亂碼*/
soap_set_namespaces(&add_soap, namespaces);/*分配命名空間*/
add_soap.connect_timeout = 60;/*設置連接超時時間 大於0 seconds 小於 0 usec*/
add_soap.send_timeout = 60;/*設置發送超時時間 大於0 seconds 小於 0 usec*/
add_soap.accept_timeout = 60;/*設置接收超時時間 大於0 seconds 小於 0 usec*/
add_soap.recv_timeout = 60;/*設置接收超時時間 大於0 seconds 小於 0 usec*/
_request.adminName = "Yu";
_request.adminPwd ="bcb15f821479b4d5772bd0ca866c00ad5f926e3580720659cc80d39c9d09802a";
_request.adminTelCellNum = "11111111111";
_request.merchantAddress ="西安";
_request.merchantClassfiy="2";
_request.merchantEmail ="[email protected]";
_request.merchantName ="610166010002";
_request.merchantTelephone = "11111111111";
/*圖片數據處理*/
FILE *fp = fopen("qr.jpg", "rb");
if (fp == NULL)
{
fprintf(stderr, "cannot open image file\n");
exit(1);
}
fseek(fp, 0, SEEK_END);
if (ferror(fp)) {
fprintf(stderr, "fseek() failed\n");
int r = fclose(fp);
if (r == EOF) {
fprintf(stderr, "cannot close file handler\n");
}
exit(1);
}
int flen = ftell(fp);
if (flen == -1) {
perror("error occurred");
int r = fclose(fp);
if (r == EOF) {
fprintf(stderr, "cannot close file handler\n");
}
exit(1);
}
fseek(fp, 0, SEEK_SET);
if (ferror(fp)) {
fprintf(stderr, "fseek() failed\n");
int r = fclose(fp);
if (r == EOF) {
fprintf(stderr, "cannot close file handler\n");
}
exit(1);
}
char data[flen+1];
//merchantLogoByte.__ptr = (unsigned char*)soap_malloc( &add_soap, flen);
int size = fread(data, 1, flen, fp);
//int size = fread(merchantLogoByte.__ptr, 1, flen, fp);
if (ferror(fp)) {
fprintf(stderr, "fread() failed\n");
int r = fclose(fp);
if (r == EOF) {
fprintf(stderr, "cannot close file handler\n");
}
exit(1);
}
int r = fclose(fp);
if (r == EOF) {
fprintf(stderr, "cannot close file handler\n");
}
printf("%d\n [%#x]\n", size, data);
merchantLogoByte.__ptr = soap_malloc( &add_soap, size);
memcpy(merchantLogoByte.__ptr, data, size);
//merchantLogoByte.__ptr = data;
//strcpy(merchantLogoByte.__ptr, data);
merchantLogoByte.__size = size;
_request.merchantLogoByte = &merchantLogoByte;
if (soap_call_ns4__spWSProcessRegist(&add_soap, NULL, NULL, &_request, &_param_7) == SOAP_OK)
{
printf( "%s(%s):%d|Call webservce OK [%s] [%s]\n",__FILE__,__FUNCTION__,__LINE__, _param_7._spWSProcessRegistReturn->resultCode, _param_7._spWSProcessRegistReturn->resultMsg);
}
else
{
printf("%s(%s):%d|soap err:%d,%s,%s",__FILE__,__FUNCTION__,__LINE__,add_soap.error,*soap_faultcode(&add_soap),*soap_faultstring(&add_soap));
return -1;
}
soap_end(&add_soap); /*清除運行環境變量*/
soap_done(&add_soap); /*卸載運行環境變量*/
return 0;
}