C ++ — Cocos2d-x — Как загрузить файл на сервер с помощью PHP?

Я хочу загрузить файл методом POST, используя CCHttpClient.

Сервер был полностью готов принять файл, потому что я использую Java и Objective C уже успешно загружен.

Мне интересно, как сделать данные POST в файл в cocos2d-x.

std :: string path = CCFileUtils :: sharedFileUtils () -> getWritablePath () + "temp.png";
unsigned long buff = 0;
unsigned char * pBuffer = CCFileUtils :: sharedFileUtils () -> getFileData (path.c_str (), "r", & buff);

Сначала сделано в виде файла данных без знака,

const char * fileBinary = (const char *) pBuffer;

имеет приведение к константному символу.

Следующие сделали это к данным POST.

std :: string boundary = "--------------------------- 14737809831466499882746641449";
std :: string str = "\ r \ n--" + boundary + "\ r \ n";
str = str + "Content-Disposition: attachment; name = \" upload_file \ "; filename = \" 11.png \ "\ r \ n";
str = str + "Content-Type: application / octet-stream \ r \ n \ r \ n";
str = str + fileBinary; <- This is the data portion of the file.
str = str + "\ r \ n--" + boundary + "- \ r \ n";

Сделайте это, передав метод POST, файл загружен, но данные загруженного файла имеют всего 8 байт.

Как мне создать данные для отправки файла?

Вот полный код.

std::string path = CCFileUtils::sharedFileUtils()->getWritablePath() + "temp.png";
unsigned long buff = 0;
unsigned char* pBuffer = CCFileUtils::sharedFileUtils()->getFileData(path.c_str(), "r", &buff);

const char* fileBinary = (const char*)pBuffer;std::string boundary = "---------------------------14737809831466499882746641449";
std::string bound = boundary;
std::vector<std::string> headers;
headers.push_back("Content-Type: multipart/form-data; boundary="+bound);

std::string str = "\r\n--" + boundary + "\r\n";
str = str + "Content-Disposition: attachment; name=\"upload_file\"; filename=\"11.png\"\r\n";
str = str + "Content-Type: application/octet-stream\r\n\r\n";
str = str + fileBinary;
str = str + "\r\n--" + boundary + "--\r\n";CCHttpRequest* request = new CCHttpRequest();
request->setUrl("SERVER ADDRESS");
request->setHeaders(headers);
request->setRequestType(CCHttpRequest::kHttpPost);
request->setRequestData(str.c_str(), strlen(str.c_str()));
request->setResponseCallback(this, httpresponse_selector(MainScene::complete));
request->setTag("UP IMAGE");
CCHttpClient::getInstance()->send(request);
request->release();

0

Решение

Девятый байт PNG равен нулю.

Когда вы объединяете данные файла здесь:

str = str + fileBinary;

он копируется только до первого нуля.

Вы должны иметь возможность создать «двоичную» строку, например:

 std::string(fileBinary, lengthOfFileBinary)

так как этот конструктор может создать строку, содержащую нулевые байты.
Вам нужно будет получить размер от чего-то другого, что strlen, поскольку strlen бессмысленно с двоичными данными.
(Cocos, вероятно, имеет функцию, которая возвращает размер файла).

Тогда вы можете использовать

request->setRequestData(str.data(), str.size());
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector