غير قادر على الوصول إلى بيانات HTTP PUT في رمز خدمة الويب

StackOverflow https://stackoverflow.com/questions/145855

  •  02-07-2019
  •  | 
  •  

سؤال

الجميع،

كجزء من التطبيق الذي أكتبه، أحتاج إلى الحصول على خدمة ويب HTTP PUT التي تقبل بيانات الصور الواردة، والتي سيتم تحليلها والتحقق من صحتها وإضافتها إلى مخزن الملفات المحلي.

تنشأ مشكلتي بعد التحقق من الحجم باسم

$_SERVER['CONTENT_LENGTH']

له قيمة > 0، وهذه القيمة مطابقة لحجم ملف الاختبار، لذا يمكنني أن أفترض أن كل شيء يسير على ما يرام حتى هذه النقطة لكن عندما أحاول قراءة بيانات الدفق الواردة باستخدام

file_get_contents('php://stdin');

أحصل على سلسلة فارغة.لقد حاولت أيضًا استخدام

file_get_contents('php://input');

وهذا يعطيني نفس النتيجة لسلسلة فارغة.

سيكون موضع تقدير أي مساعدة أو اقتراحات أو توجيه.

ملحوظة:أنا استخدم

  • بي إتش بي 5.2.6
  • أباتشي 2.0
هل كانت مفيدة؟

المحلول

أفضل تخميني هو أنك تحتاج إلى تغيير httpd.conf حتى لا ترفض طلبات PUT.هل تأكدت من ذلك؟

نصائح أخرى

يرفض Apache HTTPD طلبات PUT افتراضيًا.يمكنك التحقق من mod_put:
http://perso.ec-lyon.fr/lyonel.vincent/apache/mod_put.html

وأضف هذا إلى httpd.conf:

<Location /upload/dir>
  EnablePut On
  AuthType Basic
  AuthName "Web publishing"
  AuthUserFile /www/etc/passwd
  AuthGroupFile /www/etc/group
  <Limit PUT>
    require valid-user
  </Limit>
</Location>

file_get_contents لا يأخذ المعلمة "r" - انظر صفحة دليل PHP:

string file_get_contents  ( string $filename  [, int $flags...)

صالح $flag القيم هي FILE_USE_INCLUDE_PATH, FILE_TEXT, FILE_BINARY.

حاول إزالة العلامة "r" وحاول مرة أخرى

يحرر - تم تحديث السؤال، تم تجاهل العلامة "r" ومن الواضح أنها ليست جذر المشكلة.

يبدو أن هناك تم الإبلاغ عن خطأ في PHP متعلق file_get_contents إرجاع سلسلة فارغة لـ HTTP POST.من وصف الخطأ:

file_get_contents('php://input') (و أيضا file, fopen+fread) لا يقوم بإرجاع بيانات النشر ، عندما يكون النموذج المُخطط مع enctype = "multipart/form-data".

عند تقديم نفس النموذج دون تحديد enctype (لذلك يتم استخدام "Application/X-WWW-Form-urlencoded" الافتراضي).

لذلك يبدو أن الحل البديل هو تغيير نموذج النموذج المحدد بعيدًا عن multipart/form-data, ، والتي من الواضح أنها ليست مثالية لتحميل الصور - من مواصفات نموذج W3:

نوع المحتوى "application/x-www-form-urlencoded" غير فعال لإرسال كميات كبيرة من البيانات الثنائية أو النص الذي يحتوي على أحرف غير ASCII.يجب استخدام نوع المحتوى "متعدد الأجزاء/بيانات النموذج" لإرسال النماذج التي تحتوي على ملفات وبيانات غير ASCII وبيانات ثنائية.

مزيد من التحرير

يبدو أن هذا الخطأ قد تم حله في إصدار PHP الخاص بك.هل قمت بالتحقق للتأكد من أن المخزن المؤقت الذي تتم قراءته لا يبدأ بحرف إرجاع/سطر جديد؟هناك مشكلة تشبه إلى حد ما مشكلتك والتي تمت مناقشتها على نقطة الموقع.

حاول الجري strlen على المدخلات ونرى ما هو الطول.

ال r لقد حصلت على الحجة الثانية ليست صحيحة. file_get_contents لا يستخدم a/r/w/a+/r+/w+ الحجج التي fopen الاستخدامات.ربما تريد إزالته والقيام بما يلي:

file_get_contents('php://input');

يرى http://us3.php.net/file_get_contents.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top