غير قادر على الوصول إلى بيانات HTTP PUT في رمز خدمة الويب
-
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');