phpuploadserverpngcocos2d-x-3.x

How to upload a png file in cocos2dx to a php server


I need to upload a .png file from cocos2dx to a php server. (.txt is fine for testing purposes)

I edited the engine like described here:

http://discuss.cocos2d-x.org/t/upload-file-with-httpclient-solved/18028/4 and here: https://github.com/FenneX/FenneX/commit/134e9433c1dbc3ca6f772ce4c149bf911275a7e9

So now what? How can I upload a file to the server?

This is my attempt but I'm an http/network noob so I have no idea what I am doing... I just need a simple working example to start with.

cocos2dx upload button source:

    //  HTTP post
    auto buttonPost = CustomButton::create("Post data",[this](Ref *pSender){

        __String *dataToSend = __String::create("dataOne=45&dataTwo=100");


        cocos2d::network::HttpRequest *request =
            new cocos2d::network::HttpRequest();

        request->setUrl("http://XXX.XXX.XXX.XXX/post.php");
        request->setRequestType(cocos2d::network::HttpRequest::Type::POSTFILE);

        request->setRequestData(dataToSend->getCString(), dataToSend->length());

        request->setFilePath("res/test.txt");

        request->setResponseCallback( [=]
            (network::HttpClient* client,
            network::HttpResponse* response)
        {

            std::vector<char> *buffer = response->getResponseData();
            printf("Get data from server");

            for (unsigned int i = 0; i < buffer->size(); i++)
            {
                printf("%c", (*buffer)[i]);
            }

            printf("\n\n\n");

            printf("Response Code %li   ", response->getResponseCode());

            if (200 == response->getResponseCode())
            {
                printf("OK \n");
            }
            else
            {
                printf("failed \n");
            }

        });

        cocos2d::network::HttpClient::getInstance()->send(request);
        request->release();

    });

Php server side code:

        <?php
        $uploaddir = "uploads/";
        $uploadfile = $uploaddir . basename( $_FILES['file']['name']);

        if(move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile))
        {
          echo "The file has been uploaded successfully";
        }
        else
        {
          echo "There was an error uploading the file";
        }
        ?>

Solution

  • Thanks stack overflow for this 'great answer'...

    The client code:

            //The url where you have the server side upload script
            std::string url = "http://XXX.XXX.XXX.XXX/upload.php";
    
    
            //The basename is the whatever you use in the server side as 'file' id
            //I think can be 'uploadedfile'
            //or whatever as long as it'll be the same in both sides (client/server)
            //in php:
            //$_FILES['file']['name']
            //$_FILES['file']['tmp_name']
    
            std::string basename = "mobileFile";
    
            //File name and full path
            std::string filename = "chart.png";
            std::string path = "res/" + filename;
    
            long bufferSize = 0;
            unsigned char* pBuffer = CCFileUtils::getInstance()->getFileData(path.c_str(), "r", &bufferSize);
    
            //The same file stored as a string of "bytes" (it may contain zeroes)
            std::string data = std::string((const char*)pBuffer, bufferSize);
    
    
            //Create an http post request
            cocos2d::network::HttpRequest *request = new cocos2d::network::HttpRequest();
            request->setUrl(url.c_str());
            request->setRequestType(cocos2d::network::HttpRequest::Type::POST);
    
            //Include this boundary in the header and in the body of the request
            std::string boundary = "---------------------------14737809831466499882746641449";
    
            //The content of the request must be multipart/form-data
            std::vector<std::string> contentType;
            contentType.push_back("Content-Type: multipart/form-data; boundary=" + boundary);
    
            //Set the header with the previous content type
            request->setHeaders(contentType);
    
            //Build the body of the request. Include the boundary, basename and file name.
            //Specify the content disposition and type
    
            std::string body = "\r\n--" + boundary + "\r\n";
            body = body + "Content-Disposition: form-data; name=\"" + basename
                        + "\"; filename=\"" + filename + "\"\r\n";
            body = body + "Content-Type: application/octet-stream\r\n\r\n";
    
            //Then append the file data and again the boundary
            body = body + data;
            body = body + "\r\n--" + boundary + "--\r\n";
    
            request->setRequestData(body.data(), body.size());
    
            //Just a tag...
            request->setTag("UPLOAD FILE");
    
            //Check that everything went OK when the request response calls your app back:
                request->setResponseCallback( [=]
                    (network::HttpClient* client,
                    network::HttpResponse* response)
                {
    
                    std::vector<char> *buffer = response->getResponseData();
                    printf("Get data from server:\n");
    
                    for (unsigned int i = 0; i < buffer->size(); i++)
                        { printf("%c", (*buffer)[i]); }
    
                    printf(" Response Code %li   ", response->getResponseCode());
                    if (200 == response->getResponseCode()){ printf("OK \n"); }
                    else{ printf("failed \n"); }
    
                });
    
            //Finally send the request:
            cocos2d::network::HttpClient::getInstance()->send(request);
    
            //And then get rid of it:
            request->release();
    

    The php code: (of course this is for testing purposes)

        <?php
    
            $base = 'mobileFile';
            $uploaddir = 'uploads/';
            $file = basename($_FILES[$base]['name']);
            $uploadfile = $uploaddir . $file;
    
            echo "file=".$file; 
    
            if (move_uploaded_file($_FILES[$base]['tmp_name'], $uploadfile)) 
            {
                echo "   uploaded: ".$file;
            }
            else 
            {
                echo "error";
            }
    
        ?>