zip
cocos2d-x

Cocos2d-xでのzipダウンロードと解凍

More than 1 year has passed since last update.

はじめに

追加でデータをダウンロードして保存したい場合やデータを更新したい場合に重要

準備する事

  • Dropbox
  • GoogleDrive
  • レンタルサーバー

上記の自身が使用したいデータサーバー

zipダウンロードとzipの解凍

Download.ccp
#include "network/HttpRequest.h"
#include "network/HttpClient.h"

void Download::Data(){
    //Dropboxの場合
    //データを共有した後のアドレスを使う
    //https://www.dropbox.com/sh/269qylxhh1niprx/test.zip?dl=0
    //アクセスアドレス→sh/269qylxhh1niprx
    //ファイル名→test.zip
    std::string fullUrl = "https://dl.dropboxusercontent.com/sh/269qylxhh1niprx/test.zip";

    //GoogleDriveの場合
    //共有可能なリンクを取得する
    //https://drive.google.com/open?id=0ByUxbvgVU34iWVRYX5dxNFRWbTQ
    //アクセスアドレス変更箇所→0ByUxbvgVU34iWVRYX5dxNFRWbTQ
    std::string fullUrl = "https://drive.google.com/uc?id=0ByUxbvgVU34iWVRYX5dxNFRWbTQ";

    //レンタルサーバーの場合
    //zipのフルパスでアクセス可能
    std::string fullUrl = "http://test-site.com/data/test/test.zip" 

    auto request = new cocos2d::network::HttpRequest();
    request->setUrl(fullUrl.c_str());
    request->setRequestType(cocos2d::network::HttpRequest::Type::GET);
    request->setResponseCallback([=](cocos2d::network::HttpClient* client, cocos2d::network::HttpResponse* response){
        if (response->isSucceed()) {
            if(response->getResponseCode() == 200){
                // ファイルへ保存せずに、そのまま展開する
                unzip(&response->getResponseData()->at(0), response->getResponseData()->size());

            }else{
                CCLOG("%s", response->getHttpRequest()->getUrl());
                CC_ASSERT(0);
            }
        }
    });

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

void Download::unzip(const void* data, ssize_t datasize){
    // 保存先のルートパスを取得
    std::string path = FileUtils::getInstance()->getWritablePath() + "download/";
    //ディレクトリ(フォルダー)がなければ作成
    if (!FileUtils::getInstance()->isDirectoryExist(path)) {
        FileUtils::getInstance()->createDirectory(path);
    }

    const std::string writablePath(path);

    // zipに含まれるファイル情報リストを取得
    ZipFile* zipfile = ZipFile::createWithBuffer(data, datasize);
    for(std::string filename = zipfile->getFirstFilename(); !filename.empty(); filename = zipfile->getNextFilename()){
        if(*filename.rbegin() == '/'){
            if(FileUtils::getInstance()->createDirectory(writablePath + filename)) {
                //log("CREATE FOLDER:%s", (writablePath + filename).c_str());
            }
        }else{
            ssize_t filesize;
            unsigned char* filedata = zipfile->getFileData(filename, &filesize);

            const std::string fullPath(writablePath + filename);

            FILE* file = fopen(fullPath.c_str(), "wb");
            fwrite(filedata, filesize, 1, file);
            fclose(file);
            free(filedata);
        }
    }
    delete zipfile;
}


Part1 ~HTTPリクエスト~ 参照のHTTPリクエストと違いTypeはGETにする

request->setRequestType(cocos2d::network::HttpRequest::Type::GET);

ダウンロードは無料のクラウドを使用することが可能
私の主観

  • Dropbox
    • ダウンロード速度は時間帯によってまちまち
    • 日本時間の22時から朝6時までは速い
    • それ以外の時間帯は遅くなる
  • GoogleDrive
    • ダウンロードは全時間帯安定する
    • 速さはDropboxの最速には及ばないが安定して速い
  • レンタルサーバー
    • レンタルサーバーの速度に依存
    • 国内からのアクセスは速いだろう

注意

Mac標準zipとwindows標準zipは違うかもしれない
この解凍はwin標準zipで確認している

次回

ファイルアップロード