2

我是 C++ 新手。我在 c# 中编写了上传文件 wcf 并使用 gsoap2.8 生成 header.h 文件。

这是我在 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();
        }

    }

下面是 gsoap2.8 从 wsdl 生成的 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

4

1 回答 1

2

这是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;

更新:使用soap_malloc分配内存

采用:

buffer=(unsigned char *)soap_malloc(soap,fileLen+1);

代替:

buffer=(unsigned char *)malloc(fileLen+1);

消除:

free(buffer);

分配将在当前操作的上下文中完成,释放将在操作完成时由 gsoal 库完成。

于 2013-01-17T17:33:08.177 回答