2017-01-13 3 views
0

POSTエンドポイントを押して、バイナリデータをzipファイルとして保存し、ローカルディレクトリにダウンロードする必要があります。私はPOSTエンドポイントに到達し、バイナリデータを取得することができましたが、私はそれを変換したり、zipファイルとして保存するのに苦労しています。リクエストPOSTエンドポイントから返された生のバイナリからzipファイルをダウンロードするにはどうすればいいですか?

def post(cls, url, access_token, obj=None): 
    return WebResponse.from_requests(requests.post(url, data=None if obj is None else obj.json(), headers=cls.secure_header(access_token) if obj is None else cls.secure_json_header(access_token))) 

def download_contract(self, contract): 
    return SecureWebRequest.post(self.CONTRACT_EXPORT_URL, obj=contract, access_token=self.access_token) 

次のコードは、私は、エンドポイントを打つと、それはレスポンスの取得と保存しようとしている程度である。

機能download_contractは、私は契約は私が解析してるJSONがあるエンドポイントをヒットするために使用するPOSTですそれはzipファイルです。私は(context.response)を印刷するときに返さ何

@then(u'I will download file from S3') 
def step_impl(context): 
    print(context.response) 
    file_name = 'myzip.zip' 
    with context.services.autoimport.download_contract(DownloadContract(context.program_id, complete_filename(context.filename))) as response, open(file_name, 'wb') as out_file: 
     shutil.copyfileobj(response, out_file) 
     with zipfile.ZipFile(file_name) as zf: 
      zf.extractall() 

次のとおりです。

WebResponse(200,m_-Jinstrument.xmlmPÍ Â0
žď)B_ ÖQ1CđŕYń8ĘI kGßޡ)Ă\ň}|?FłČeqÁťť×=Lť&sRÁĐxÜăcŇĽHżÁ:Źů9 üż7OĚhtÓé`Ä#CŤ3>ÚŇŞV­hŕşwZÂč8yłś 32Wű\ep

にWebResponseはSTATUS_CODEは、200のHTTPステータスコードに対応しており、結果は(STATUS_CODE、結果)でありますエンドポイントによって返された生データ。

class WebResponse(): 
    STATUS_OK = 200 
    STATUS_CREATED = 201 
    STATUS_ACCEPTED = 202 
    STATUS_NOCONTENT = 204 
    STATUS_BADREQUEST = 400 
    STATUS_UNAUTHORIZED = 401 
    STATUS_FORBIDDEN = 403 
    STATUS_NOTFOUND = 404 
    STATUS_CONFLICT = 409 
    STATUS_INVALID = 422 
    STATUS_INTERNALSERVER_ERROR = 500 

    def __init__(self, r, result=None): 
     self.status_code = r.status_code 
     self.text = r.text 
     self.headers = r.headers 
     self.result = r.text if result is None else result 

    def __repr__(self): 
     return 'WebResponse(%s, %s)' % (self.status_code, self.result) 

エラーThrownback:

Traceback (most recent call last): File "/Users/ss/anaconda/envs/autoimport-server/lib/python3.4/site-packages/behave/model.py", line 1456, in run match.run(runner.context) File "/Users/ss/anaconda/envs/autoimport-server/lib/python3.4/site-packages/behave/model.py", line 1903, in run self.func(context, *args, **kwargs) File "features/steps/miu_connector_steps.py", line 255, in step_impl with context.services.autoimport.download_contract(DownloadContract(context.program_id, complete_filename(context.filename))) as response, open(file_name, 'wb') as out_file: AttributeError: exit

+0

http://stackoverflow.com/a/9419208/6626530 - あなたは – Shijo

+0

urllib2.urlopenしようとするためにすべきことがあり@ShijoそれでZipファイルとのリンクが必要ですが、私は唯一ヒットすることができるPOSTエンドポイントしか持っていません。すなわち "http://accautoimport.miuinsights.com/v1/contractsExport" – user4659009

+0

how about about http://stackoverflow.com/questions/13137817/how-to-download-image-using-requests – Shijo

答えて

0

あなたの応答が'WebResponse(200,m_-Jins ...'のように見え、それはあなたがファイルshutil.copyfileobj(response, out_file)に書いているものです。

response.resultをファイルに書き込むとします。 Btw。 out_fileの内容は何ですか?

+0

はい、私は ' response.result'をファイルに追加します。 何もせず、その行に到達する前に失敗します – user4659009

+0

エラー(完全なトレースバックであなたの投稿を編集する)は何ですか? –

+0

私はあなたの提案された解決策を試してみると、私は次のようなことになります。 'shutil.copyfileobj(context.response.result、f) ファイル" /Users/ss/anaconda/envs/autoimport-server/lib/python3.4/shutil.py "、copyfileobjの67行目 buf = fsrc .read(length) AttributeError: 'str'オブジェクトに属性 'read''がありません – user4659009

0

には、がありません。ここで、rは、requestsです。

class WebResponse(): 
    STATUS_OK = 200 
    STATUS_CREATED = 201 
    STATUS_ACCEPTED = 202 
    STATUS_NOCONTENT = 204 
    STATUS_BADREQUEST = 400 
    STATUS_UNAUTHORIZED = 401 
    STATUS_FORBIDDEN = 403 
    STATUS_NOTFOUND = 404 
    STATUS_CONFLICT = 409 
    STATUS_INVALID = 422 
    STATUS_INTERNALSERVER_ERROR = 500 

    def __init__(self, r, result=None): 
     self.status_code = r.status_code 
     self.text = r.text 
     self.headers = r.headers 
     self.raw = r.raw 
     self.result = r.text if result is None else result 

私はそれが動作を取得するために、次の私のコードを変更:

@then(u'I will download the zip file from the service') 
def step_impl(context): 
    with open(context.filename, 'wb') as fd: 
     for chunk in context.response.iter_content(chunk_size=128): 
      fd.write(chunk) 
関連する問題