2013-01-11 26 views
1

我是C++新手。我已经写在c#中的上传文件wcf,并有gsoap2.8生成header.h文件。gsoap c文件读取

这是我在c#中的上传文件wcf服务。

public void UploadFile(RemoteFileInfo request) 
    { 
     FileStream targetStream = null; 
     Stream sourceStream = request.FileByteStream; 

     string uploadFolder = @"C:\temp\upload\copyHere"; 
     string filePath = Path.Combine(uploadFolder, request.FileName); 

     using (targetStream = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.None)) 
     { 
      //read from the input stream in 6K chunks 
      //and save to output stream 
      const int bufferLen = 65000; 
      byte[] buffer = new byte[bufferLen]; 
      int count = 0; 
      while ((count = sourceStream.Read(buffer, 0, bufferLen)) > 0) 
      { 
       targetStream.Write(buffer, 0, count); 
      } 
      targetStream.Close(); 
      sourceStream.Close(); 
     } 

    } 

下面是一个WSDL通过gsoap2.8产生header.h代码:

class SOAP_CMAC xsd__base64Binary 
{ 
public: 
    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 */ 
    struct soap *soap; /* transient */ 
public: 
    virtual int soap_type() const { return 8; } /* = unique id SOAP_TYPE_xsd__base64Binary */ 
    virtual void soap_default(struct soap*); 
    virtual void soap_serialize(struct soap*) const; 
    virtual int soap_put(struct soap*, const char*, const char*) const; 
    virtual int soap_out(struct soap*, const char*, int, const char*) const; 
    virtual void *soap_get(struct soap*, const char*, const char*); 
    virtual void *soap_in(struct soap*, const char*, const char*); 
      xsd__base64Binary() { xsd__base64Binary::soap_default(NULL); } 
    virtual ~xsd__base64Binary() { } 
}; 

class SOAP_CMAC _ns1__RemoteFileInfo 
{ 
public: 
    xsd__base64Binary FileByteStream; /* SOAP 1.2 RPC return element (when namespace qualified) */ /* required element of type ns2:StreamBody */ 
    struct soap *soap; /* transient */ 
public: 
    virtual int soap_type() const { return 14; } /* = unique id SOAP_TYPE__ns1__RemoteFileInfo */ 
    virtual void soap_default(struct soap*); 
    virtual void soap_serialize(struct soap*) const; 
    virtual int soap_put(struct soap*, const char*, const char*) const; 
    virtual int soap_out(struct soap*, const char*, int, const char*) const; 
    virtual void *soap_get(struct soap*, const char*, const char*); 
    virtual void *soap_in(struct soap*, const char*, const char*); 
      _ns1__RemoteFileInfo() { _ns1__RemoteFileInfo::soap_default(NULL); } 
    virtual ~_ns1__RemoteFileInfo() { } 
}; 

这是我TEST.CPP代码。我需要阅读文件到xsd__base64Binary,所以我可以分配到remoteFile.FileByteStream

BasicHttpBinding_USCOREITransferService svc; 
__ns1__UploadFileResponse uploadRespond; 
_ns1__RemoteFileInfo remoteFile; 

std::string path = "C:\\temp\\upload\\test.txt"; 

我需要阅读上述文件到 ????

remoteFile.FileByteStream = ? 

这样我就可以调用webservice的uploadFile如下:

int result = svc.__ns1__UploadFile(&remoteFile, uploadRespond); 

谢谢你在前进,

JH

回答

1

这里是C的一个例子:

unsigned char * buffer; 
    int fileLen;  
    FILE *file; 

    //OPEN FILE 
    file = fopen(name, "rb"); 
    if (!file) 
    { 
     fprintf(stderr, "Unable to open file %s", name); 
     return; 
    } 

    //GET FILE LENGTH 
    fseek(file, 0, SEEK_END); 
    fileLen=ftell(file); 
    fseek(file, 0, SEEK_SET); 

    //ALLOCATE MEMORY 
    buffer=(unsigned char *)malloc(fileLen+1); 
    if (!buffer) 
    { 
     fprintf(stderr, "Memory error! :("); 
     fclose(file); 
     return; 
    } 

    //READ FILE CONTENTS INTO BUFFER AND CLOSE FILE 
    fread(buffer, fileLen, 1, file); 
    fclose(file); 

    //USE THE BUFFER .... 


    //FREE YOUR ALLOCATED BUFFER 
    free(buffer); 

在你的参数】remotefile

remoteFile.FileByteStream.__ptr = buffer; 
remoteFile.FileByteStream.__size = fileLen; 
+0

我试图做同样的....我实现与MTOM附件的SOAP客户端...和...它是如何添加的配置参数?像这样: 'Content-Type:application/zip Content-Transfer-Encoding:binary Content-ID: Content-Disposition:attachment; NAME = “example.zip”' –