Zenodo: فشل تحميل ملف أكبر عبر API إلى sandbox

تم إنشاؤها على ٢٦ سبتمبر ٢٠١٦  ·  6تعليقات  ·  مصدر: zenodo/zenodo

أهلا بك،

عندما أحاول تحميل ملف اختبار> 100 ميغابايت عبر طلبات python و Zenodo API (وضع الحماية) باستخدام الكود التالي

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 كبير جدًا" والذي لم يتم توثيقه في وثائق zenodo API).

نفس الكود الذي تم اختباره مع الملفات التي يقل 201 100 ميغا بايت يعمل ويعيد

هل وصلت إلى الحد الأقصى لحجم الملف؟ (إذا كان الأمر كذلك ، فسيكون من الجيد إضافة هذا إلى الوثائق). أو ربما يكون هذا بسبب حزمة "الطلبات" - هل يجب أن أضع البيانات متعددة الأجزاء؟

Enhancement

التعليق الأكثر فائدة

فقط في حالة مواجهة أي شخص لهذا الأمر ، فإليك بعض لغة Python للقيام بجزء تحميل الملف باستخدام واجهة برمجة التطبيقات الجديدة. هذا يعادل استدعاء CURL الموضح أعلاه لتحميل ملف واحد. لقد اختبرت ذلك بملف 160 ميغا بايت ولكنه فشل مع واجهة برمجة التطبيقات الموثقة . يستخدم هذا أيضًا الطلبات (التي تستخدمها واجهة برمجة التطبيقات الموثقة) ويقوم ببساطة بعمل إرسال جديد وتحميل ملف. لاحظ أن عنوان 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

ال 6 كومينتر

سيتعين عليك استخدام واجهة برمجة تطبيقات تحميل الملفات الجديدة (التي لم ننشرها بعد) لتحميل الملفات التي يزيد حجمها عن 100 ميجابايت. هذا لأن واجهة برمجة التطبيقات الحالية تستخدم application/mulitpart-formdata لتحميل الملف وهو غير فعال للغاية. في واجهة برمجة التطبيقات الجديدة ، تقوم بدفق المحتوى الثنائي للملف في طلب PUT وهو أسرع بكثير ولا يتطلب أي تشفير / فك تشفير في أي من الطرفين. سأرسل لك مثالاً لاحقًا اليوم.

شكرا لنظرتك! أنا متحمس بشأن مثال واجهة برمجة التطبيقات الجديدة.
ربما ترغب في التفكير في حزمة Python "طلبات-حزام الأدوات" التي تسمح أيضًا بدفق كائنات بيانات النموذج متعددة الأجزاء. لكني أعتقد أن أي حل بدون متطلبات الترميز هو موضع تقدير.

نعتذر عن التأخير الطويل في الرد على هذا:

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>”

فقط في حالة مواجهة أي شخص لهذا الأمر ، فإليك بعض لغة Python للقيام بجزء تحميل الملف باستخدام واجهة برمجة التطبيقات الجديدة. هذا يعادل استدعاء CURL الموضح أعلاه لتحميل ملف واحد. لقد اختبرت ذلك بملف 160 ميغا بايت ولكنه فشل مع واجهة برمجة التطبيقات الموثقة . يستخدم هذا أيضًا الطلبات (التي تستخدمها واجهة برمجة التطبيقات الموثقة) ويقوم ببساطة بعمل إرسال جديد وتحميل ملف. لاحظ أن عنوان 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

تضمين التغريدة
هل تعتقد أنه من الممكن دفق ملف مقسم إلى الحاوية باستخدام requests.put ؟
مفهوم:
لدي مجموعة من الملفات الكبيرة التي أرغب في zipstream دون إنشاء ملف مضغوط في الذاكرة أو على القرص مسبقًا. أرغب في تمرير كائن منشئ إلى تيار الثمانية لطريقة الطلب.

تعثرت عبر هذا أثناء محاولة تحميل الملفات باستخدام API. بالنسبة لي ، فشلت واجهة برمجة التطبيقات المتدفقة حيث تم تحميل حوالي نصف ملف 986 كيلوبايت فقط ، مما أدى إلى ملف 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> في سطر الأوامر curl وتم تحميل الملف بأكمله.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات