2016-10-05 4 views
0

Мне нужно загрузить файл .png из cocos2dx на php-сервер. Так что теперь https://github.com/FenneX/FenneX/commit/134e9433c1dbc3ca6f772ce4c149bf911275a7e9Как загрузить файл png в cocos2dx на php-сервер

: (.txt отлично подходит для целей тестирования)

я редактировал двигатель, как описано здесь:

http://discuss.cocos2d-x.org/t/upload-file-with-httpclient-solved/18028/4 и здесь? Как загрузить файл на сервер?

Это моя попытка, но я http/network noob, поэтому я понятия не имею, что я делаю ... Мне просто нужен простой рабочий пример для начала.

cocos2dx источник кнопка загрузки:

// 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 сторона сервера код:

 <?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"; 
     } 
     ?> 

ответ

0

Благодаря переполнению стека для этого 'большого ответа' ...

Код клиента:

 //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(); 

Код php: (конечно, это предназначено для целей тестирования)

<?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"; 
     } 

    ?> 
Смежные вопросы