c 處理基於java服務端byte[]數組接收圖片( xsd__base64Binary)

背景: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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章