μλ νμΈμ,
λ€μ μ½λλ₯Ό μ¬μ©νμ¬ Python μμ² λ° Zenodo API(μλλ°μ€)λ₯Ό ν΅ν΄ > 100MBμ ν μ€νΈ νμΌμ μ λ‘λνλ €κ³ ν λ
data = {'filename': 'test.zip'}
files = {'file': open(filename, 'rb')}
r = requests.post("https://sandbox.zenodo.org/api/deposit/depositions/%s/files?access_token=TOKEN" % deposition_id, data=data, files=files)
http μ€λ₯ μ½λ 413
("413 Request Entity Too Large", btwλ zenodo API λ¬Έμμ λ¬Έμνλμ§ μμ)λ₯Ό λ°νν©λλ€.
< 100MB νμΌλ‘ ν
μ€νΈν λμΌν μ½λκ° μλνκ³ 201
λ°νν©λλ€.
νμΌ ν¬κΈ° μ νμ λλ¬νμ΅λκΉ? (λ§μ½ κ·Έλ λ€λ©΄ μ΄κ²μ λ¬Έμμ μΆκ°νλ κ²μ΄ μ’μ κ²μ λλ€). μλλ©΄ "μμ²" ν¨ν€μ§ λλ¬ΈμΌ μλ μμ΅λλ€. λ°μ΄ν°λ₯Ό μ¬λ¬ λΆλΆμΌλ‘ λ£μ΄μΌ ν©λκΉ?
100MBλ³΄λ€ ν° νμΌμ μ
λ‘λνλ €λ©΄ μλ‘μ΄ νμΌ μ
λ‘λ API(μμ§ κ²μνμ§ μμ)λ₯Ό μ¬μ©ν΄μΌ ν©λλ€. μ΄λ νμ¬ APIκ° application/mulitpart-formdata
λ₯Ό μ¬μ©νμ¬ νμΌμ μ
λ‘λνλ λ° κ·Έλ€μ§ ν¨μ¨μ μ΄μ§ μκΈ° λλ¬Έμ
λλ€. μ APIμμλ ν¨μ¬ λ λΉ λ₯΄κ³ μμͺ½ λμμ μΈμ½λ©/λμ½λ©μ΄ νμνμ§ μμ PUT μμ²μΌλ‘ νμΌμ μ΄μ§ μ½ν
μΈ λ₯Ό μ€νΈλ¦¬λ°ν©λλ€. μ€λμ μ‘°κΈ μ΄λ° μμ λ₯Ό 보λ΄λλ¦¬κ² μ΅λλ€.
μ‘°μ¬ν΄ μ£Όμ
μ κ°μ¬ν©λλ€! λλ μλ‘μ΄ APIμ μμ λν΄ ν₯λΆν©λλ€.
λ€μ€ ννΈ μμ λ°μ΄ν° κ°μ²΄λ₯Ό μ€νΈλ¦¬λ°ν μλ μλ python ν¨ν€μ§ "requests-toolbelt"λ₯Ό κ³ λ €νκ³ μΆμ μλ μμ΅λλ€. κ·Έλ¬λ μΈμ½λ© μꡬ μ¬νμ΄ μλ μ루μ
μ λμ΄ νκ°λ κ²μ
λλ€.
μ΄μ λν λ΅λ³μ΄ μ€λ μ§μ°λ μ μ¬κ³Όλ립λλ€.
1) λ²ν· URL μ°ΎκΈ°:
$ curl -H "Accept: application/json" -H "Authorization: Bearer <access token>" "https://www.zenodo.org/api/deposit/depositions/<deposit id>"
{
"links": {
"bucket": "https://www.zenodo.org/api/files/<bucket id>",
...
},
...
2) λ²ν·μ νμΌ μ λ‘λ
$ curl -X PUT -H "Accept: application/json" -H "Content-Type: application/octet-stream" -H "Authorization: Bearer <access_token>" -d @<path to local file> https://www.zenodo.org/api/files/<bucket id>/<filename>
λ²ν·μλ λ²μ μ΄ μ§μ λμ΄ μμΌλ―λ‘ νμΌμ λ€μ μμ ν μ κ±°νλ €λ©΄ λ²μ λ§ν¬λ₯Ό μ¬μ©ν΄μΌ ν©λλ€. λ²ν· λͺ©λ‘μμ μ°ΎμΌμμμ€.
$ curl -H "Accept: application/json" -H "Authorization: Bearer <access token>" "https://www.zenodo.org/api/files/<bucket id>β
{
"contents": [
{
"links": {
"version": "https://zenodo.org/api/files/<bucket id>/<filename>?versionId=<versionId>",
...
},
"key": "<filename>",
...
},
...
νμΌ μμ :
$ curl -X DELETE -H "Accept: application/json" -H "Authorization: Bearer <access_token>" https://www.zenodo.org/api/files/<bucket id>/<filename>?versionId=<versionId>β
λκ΅°κ° μ΄ λ¬Έμ λ₯Ό μ ν κ²½μ°λ₯Ό λλΉνμ¬ μ APIλ₯Ό μ¬μ©νμ¬ νμΌ μ λ‘λ λΆλΆμ μννλ Pythonμ΄ μμ΅λλ€. μ΄λ λ¨μΌ νμΌμ μ λ‘λνκΈ° μν΄ μμμ μ€λͺ ν CURL νΈμΆκ³Ό λμΌν©λλ€. λ¬Έμν λ APIλ‘ μ€ν¨ν 160MB νμΌλ‘ ν μ€νΈνμ΅λλ€. μ΄κ²μ λν μμ²(λ¬Έμνλ APIκ° μ¬μ©νλ)μ μ¬μ©νκ³ λ¨μν μ μ μΆμ λ§λ€κ³ νμΌμ μ λ‘λν©λλ€. μ¬μ©λ URLμ μλλ°μ€ URLμ λλ€.
import requests
r = requests.post('https://sandbox.zenodo.org/api/deposit/depositions',
params={'access_token': ACCESS_TOKEN}, json={},
headers={"Content-Type": "application/json"})
print r.status_code
bucket_url = r.json()['links']['bucket']
filename='bigfile.txt'
r = requests.put('%s/%s' % (bucket_url,filename),
data=open(filename, 'rb'),
headers={"Accept":"application/json",
"Authorization":"Bearer %s" % ACCESS_TOKEN,
"Content-Type":"application/octet-stream"})
print r.status_code
@lnielsen @jakelever
requests.put
μ¬μ©νμ¬ μ²ν¬ νμΌμ λ²ν·μΌλ‘ μ€νΈλ¦¬λ°ν μ μλ€κ³ μκ°νμλκΉ?
λ¬Έλ§₯:
λ©λͺ¨λ¦¬λ λμ€ν¬μ 미리 μμΆ νμΌμ μμ±νμ§ μκ³ μμΆμ νκ³ μΆμ λμ©λ νμΌ μΈνΈκ° μμ΅λλ€. μμ² λ©μλμ μ₯ν
μ€νΈλ¦Όμ μμ±κΈ° κ°μ²΄λ₯Ό μ λ¬νκ³ μΆμ΅λλ€.
APIλ₯Ό μ¬μ©νμ¬ νμΌμ μ
λ‘λνλ λμ μ΄κ²μ λ°κ²¬νμ΅λλ€. λμκ² μ€νΈλ¦¬λ° APIλ 986Kb νμΌμ μ½ μ λ°λ§ μ
λ‘λλμ΄ PDFκ° μμλμκΈ° λλ¬Έμ μ€ν¨νμ΅λλ€. http://killtheradio.net/tricks-hacks/curl-cli-not-sending-full-file-data-when-using-data-binary/ κΈ°λ°μΌλ‘ -d @<path to file>
λ₯Ό -T <path to file>
λ‘ λ체 -d @<path to file>
curl λͺ
λ Ήμ€μ -T <path to file>
λ° μ 체 νμΌμ΄ μ
λ‘λλμμ΅λλ€.
κ°μ₯ μ μ©ν λκΈ
λκ΅°κ° μ΄ λ¬Έμ λ₯Ό μ ν κ²½μ°λ₯Ό λλΉνμ¬ μ APIλ₯Ό μ¬μ©νμ¬ νμΌ μ λ‘λ λΆλΆμ μννλ Pythonμ΄ μμ΅λλ€. μ΄λ λ¨μΌ νμΌμ μ λ‘λνκΈ° μν΄ μμμ μ€λͺ ν CURL νΈμΆκ³Ό λμΌν©λλ€. λ¬Έμν λ APIλ‘ μ€ν¨ν 160MB νμΌλ‘ ν μ€νΈνμ΅λλ€. μ΄κ²μ λν μμ²(λ¬Έμνλ APIκ° μ¬μ©νλ)μ μ¬μ©νκ³ λ¨μν μ μ μΆμ λ§λ€κ³ νμΌμ μ λ‘λν©λλ€. μ¬μ©λ URLμ μλλ°μ€ URLμ λλ€.