تحديد ما إذا كان Blob صورة دون تحميل الحقل بأكمله؟

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

  •  12-09-2019
  •  | 
  •  

سؤال

هل هناك طريقة لقراءة بعض البايتات فقط من حقل نوع Blob في قاعدة بيانات (لهذا السؤال لا يهم العلامة التجارية DB) وتحديد ما إذا كان المحتوى الثنائي صورة (افترض أنها واحدة من: JPG، GIF، PNG)؟ لدي WebApp الذي يقوم بتخزين الملفات في قاعدة البيانات، وإذا كانت صورة، أريد إظهار صورة مصغرة، وإلا أريد إظهار أيقونة ... لكن ليس لدي أي معلومات mimetype مخزنة في أي مكان آخر لل Blob (ليس تصميمي) ... ولأنه Webapp، يحتاج تحميل الصورة إلى حدوث مكالمة منفصلة (GetImage.ashx) من كتابةu003Cimg> TAG .. وعندما أتعثر على العلامة، لا أريد أن أتعرض لقراءة النقط بأكملها إلى مكتبة، حدد ما إذا كانت صورة أو تغيير حجمها ... إلخ إلخ ... أود أن تكون قادرة على النظر إلى البايت القليلة الأولى ومعرفة ما إذا كنت بحاجة إلى كتابة العلامة أم لا. لا أفهم هياكل / تنسيقات ملفات الصور جيدا بما يكفي لمعرفة ما إذا كان هناك نوع من الرأس القياسي في البايتات القليلة الأولى التي يمكنني قراءتها لمعرفة ما إذا كانت JPG أو GIF أو PNG.

منطقي؟

إذا كنت ترغب في مساعدتي على وجه التحديد (بدلا من الرد عموما ما إذا كان يمكن القيام بذلك)، فأنا أستخدم .NET C # و SQL 2005

شكرا!

هل كانت مفيدة؟

المحلول

تبدأ PNGS مع: 89 50 4E 47 0D 0A 1A 0A؛ يرى http://www.libpng.org/pub/png/spec/1.2/png-sulture.html.

GIFS ابدأ ب 47 49 46 37 37 61 (GIF87A) أو 47 49 46 38 39 61 (GIF89A)؛ يرى http://www.fileformat.info/format/gif/egff.htm.

تبدأ JPEG مع FF D8 FF E0 XX XX 4A 4A 46 46 00 (تحرير: إضافة جزء مفقود من الرأس؛ XX XX هو طول الرأس، في بايت)؛ يرى http://www.obrador.com/essentaljpeg/headerinfo.htm.

المرجعي: http://wangrui.wordpress.com/2007/06/19/file-signatures-table/

نصائح أخرى

  • JPEG تبدأ الملفات مع FF D8 FF
  • GIF تبدأ الملفات مع GIF89a (47 49 46 38 39)

هذا يعود إلى المدرسة القديمة (تكتيكات الوصول إلى البيانات). على أي حال، يمكنك استخدام DataReader للاستيلاء على الحقل ونتائج الدفق، ثم انظر فقط إلى Firs 8 Bytes لمعرفة نوع الصورة التي تتعامل معها.

انظر هذه المقالة للحصول على مقدمة كيفية إرفاق StreamReader إلى DataReader الخاص بك.

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

قد يكون هناك تكتيك آخر لإنشاء طريقة عرض تفقد الحقل ويفرض النوع، بناء على البايتات الأولى الأولى، في SQL. نوع قبيح ولكن يعمل في قرصة.

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