يستخدم
Zhui Feng
ASP لكتابة تطبيقات مواقع الويب لفترة طويلة، ومن المحتم أن تواجه مشكلات مختلفة، من بينها، ربما تكون كيفية تحميل الملفات إلى الخادم هي المشكلة الأكثر شيوعًا، وخاصة تحميل الصور، إذا كنت ترغب في تنفيذ وظيفة "نجمة واحدة يوميًا" المشابهة لتلك التي يوفرها مجتمع NetEase الافتراضي في مجتمعك الخاص، فيجب عليك توفير الوظيفة لمستخدمي الإنترنت لتحميل الصور. لتحميل ملفات الصور إلى الخادم، يمكنك استخدام العديد من مكونات تحميل الملفات المجانية، على الرغم من أنها قوية جدًا، إلا أنه في كثير من الحالات، يمكننا فقط استخدام المساحة المجانية المدعومة من ASP أو استئجار مساحة افتراضية لأشخاص آخرين من المستحيل بالنسبة لنا استخدام مكون تحميل الملف، أما بالنسبة للحالة الثانية، فيجب علينا أيضًا دفع الكثير من "المال". ما لم يكن لديك مضيف افتراضي خاص بك، يمكنك بسهولة تثبيت المكونات التي تحتاجها على الخادم. وهذا الوضع بعيد عن متناول معظم الأشخاص. ثم لا يوجد شيء يمكننا القيام به؟ هههه الجواب نعم (طبعا نعم وإلا لن أتمكن من كتابة هذا المقال). دعونا نستخدم كود ASP خالصًا لتنفيذ وظيفة تحميل الصور وحفظها في قاعدة البيانات (بالمناسبة، نقوم أيضًا بتنفيذ وظيفة عرض الصور في قاعدة البيانات على صفحة الويب).
أولاً، دعونا نتعرف على أساليب الكائنات التي سنستخدمها. نستخدم بشكل عام كائن الطلب للحصول على البيانات التي تم تمريرها من الصفحة السابقة. وبالمثل، يمكننا أيضًا استخدام كائن الطلب للحصول على بيانات الملف الذي تم تحميله. الطريقة المستخدمة هي Request.BinaryRead(). الطريقة التي نستخدمها لقراءة بيانات الصورة من قاعدة البيانات وعرضها على صفحة الويب هي:
طلب.BinaryWrite (). عندما نحصل على بيانات الصورة ونحفظها في قاعدة البيانات، لا يمكننا استخدام عبارة Insert مباشرة لتشغيل قاعدة البيانات، وبدلاً من ذلك، يجب علينا استخدام طريقة AppendChunk الخاصة بـ ADO طريقة GetChunk. بناء الجملة المحدد لكل طريقة هو كما يلي:
*Request.BinaryRead بناء الجملة:
البديل=Request.BinaryRead(العدد)
المعلمة
البديل
تحتوي القيمة المرجعة على البيانات المقروءة من العميل.
عدد
يشير إلى مقدار البيانات التي سيتم قراءتها من العميل. هذه القيمة أقل من أو تساوي مقدار البيانات التي تم الحصول عليها باستخدام أسلوب Request.TotalBytes.
* بناء جملة Request.BinaryWrite:
طلب.BinaryWritedata
المعلمة
بيانات
الحزمة المراد كتابتها إلى متصفح العميل.
* بناء جملة Request.TotalBytes:
variator=Request.TotalBytes
المعلمة
البديل
إرجاع عدد بايتات البيانات المقروءة من العميل.
* يقوم بناء جملة AppendChunk بإلحاق البيانات بنص كبير أو حقل بيانات ثنائي أو كائن معلمة.
object.AppendChunkData
المعلمة
كائن حقل أو كائن المعلمة
نوع متغير البيانات، الذي يحتوي على البيانات الملحقة بالكائن.
الوصف استخدم أسلوب AppendChunk لكائن الحقل أو المعلمة لتعبئة البيانات الثنائية أو بيانات الأحرف الطويلة في الكائن. عندما تكون ذاكرة النظام محدودة، يمكنك استخدام الأسلوب AppendChunk لتنفيذ بعض العمليات وليس كلها على قيم أعداد صحيحة طويلة.
* يقوم بناء جملة GetChunk بإرجاع كل أو جزء من محتويات نص كبير أو كائن حقل البيانات الثنائية.
متغير=field.GetChunk(الحجم)
ترجع قيمة الإرجاع نوع المتغير.
المعلمة
حجم تعبير عدد صحيح طويل، يساوي عدد البايتات أو الأحرف التي سيتم استردادها.
الوصف استخدم أسلوب GetChunk الخاص بكائن الحقل لاسترداد بعض أو كافة بياناته الثنائية أو بيانات الأحرف الطويلة. عندما تكون ذاكرة النظام محدودة، يمكنك استخدام أسلوب GetChunk لمعالجة بعض قيم الأعداد الصحيحة الطويلة وليس كلها.
سيتم تعيين البيانات التي يتم إرجاعها بواسطة استدعاء GetChunk إلى "المتغير". إذا كان الحجم أكبر من البيانات المتبقية، إذن
يقوم GetChunk فقط بإرجاع البيانات المتبقية دون ملء "المتغير" بالفراغات. إذا كان الحقل فارغا، ثم
تقوم طريقة GetChunk بإرجاع Null.
ستقوم كل مكالمة GetChunk لاحقة باسترداد البيانات بدءًا من حيث توقفت مكالمة GetChunk السابقة. ومع ذلك، إذا قمت باسترداد البيانات من حقل واحد ثم قمت بتعيين أو قراءة قيمة حقل آخر في السجل الحالي، فسوف يفترض ADO أنه تم استرداد البيانات من الحقل الأول. إذا تم استدعاء أسلوب GetChunk مرة أخرى في الحقل الأول، فسوف يفسر ADO المكالمة على أنها عملية GetChunk جديدة ويبدأ القراءة من بداية السجل. إذا لم يكن كائن Recordset الآخر نسخة من كائن Recordset الأول، فلن يؤدي الوصول إلى الحقول الموجودة فيه إلى قطع عملية GetChunk.
إذا تم تعيين بت adFldLong في خاصية سمات كائن الحقل إلى True، فيمكنك استخدام أسلوب GetChunk في الحقل.
إذا لم يكن هناك سجل حالي عند استخدام أسلوب Getchunk على كائن حقل، فسيتم إنشاء الخطأ 3021 (لا يوجد سجل حالي).
بعد ذلك، سنقوم بتصميم قاعدة البيانات الخاصة بنا كاختبار، هيكل قاعدة البيانات لدينا هو كما يلي (access2000):
اسم الحقل، نوع الوصف، المعرف، الرقم التلقائي، قيمة المفتاح الأساسي
يتم استخدام كائن img OLE لحفظ بيانات الصورة
بالنسبة لـ MSSQLServer7، تكون البنية المقابلة كما يلي:
معرف وصف نوع اسم الحقل قيمة المفتاح الأساسي int (الهوية).
يتم استخدام صورة img لحفظ بيانات الصورة
نبدأ الآن في كتابة جزء التحميل رسميًا من كود ASP النقي الخاص بنا. أولاً، لدينا واجهة تحميل مقدمة للمستخدم، والتي تسمح للمستخدم بتحديد الصورة المراد تحميلها. الكود كالتالي (upload.htm):
<أتش تي أم أل>
<الجسم>
<المركز>
<form name = "mainForm" enctype = "multipart/form-data" action = "process.asp" الطريقة = post>
<inputtype=filename=mefile><br>
<inputtype=submitname=okvalue='OK'>
</النموذج>
</مركز>
</الجسم>
</html>
لاحظ أن enctype="multipart/form-data" يجب أن تحتوي على هذه السمة في النموذج، وإلا فلن يتم الحصول على البيانات التي تم تحميلها. بعد ذلك، نحتاج إلى إجراء المعالجة اللازمة على البيانات التي تم الحصول عليها من المتصفح فيprocess.asp، لأن البيانات التي نحصل عليها فيprocess.asp لا تحتوي فقط على بيانات الصور المحملة التي نريدها، ولكنها تحتوي أيضًا على معلومات أخرى غير مفيدة، نحتاج إليها لإزالة البيانات الزائدة عن الحاجة وحفظ بيانات الصور المعالجة في قاعدة البيانات، نأخذ هنا Access2000 كمثال. الكود المحدد هو كما يلي (process.asp):
<%
Response.buffer=true
formsize=request.totalbytes
formdata=request.binaryread(formsize)
bncrlf=chrB(13)&chrB(10)
المقسم=leftB(formdata,clng(instrb(formdata,bncrlf))-1)
datastart=instrb(formdata,bncrlf&bncrlf)+4
dataend=instrb(datastart+1,formdata,divider)-datastart
mydata=midb(formdata,datastart,dataend)
setconnGraph=server.CreateObject("ADODB.connection")
connGraph.ConnectionString="driver={MicrosoftAccessDriver(*.mdb)};DBQ="&server.MapPath("images.mdb")&";uid=;PWD=;"
connGraph.Open
setrec=server.createobject("ADODB.recordset")
rec.Open"SELECT*FROM[images]whereidisnull",connGraph,1,3
rec.addnew
rec("img").appendchunkmydata
rec.update
rec. Close
setrec=لا شيء
setconnGraph=لا شيء
%>
حسنًا، لقد قمنا الآن بحفظ الصور التي تم تحميلها في قاعدة بيانات باسم Images.mdb، والعمل المتبقي هو عرض بيانات الصورة في قاعدة البيانات على صفحة الويب. بشكل عام، في HTML، يتم استخدام علامة <IMG> لعرض الصور، أي <IMGSRC = "مسار الصورة">، ولكن يتم حفظ صورنا في قاعدة البيانات. ما هو "مسار الصورة"؟ هاها، في الواقع، بالإضافة إلى تحديد المسار، يمكن أيضًا استخدام سمة SRC هذه على النحو التالي:
<IMGSRC="showimg.asp?id=xxx">
لذلك، كل ما يتعين علينا القيام به هو قراءة البيانات المؤهلة من قاعدة البيانات في showimg.asp وإعادتها إلى سمة SRC كما يلي (showimg.asp):
<%
setconnGraph=server.CreateObject("ADODB.connection")
connGraph.ConnectionString="driver={MicrosoftAccessDriver(*.mdb)};DBQ="&
server.MapPath("images.mdb")&";uid=;PWD=;"
connGraph.Open
setrec=server.createobject("ADODB.recordset")
strsql = "selectimgfromimageswhereid = "&trim (طلب ("معرف"))
rec.openstrsql,connGraph,1,1
Response.ContentType = "صورة/*"
Response.BinaryWriterec("img").getChunk(7500000)
rec. Close
setrec=لا شيء
setconnGraph=لا شيء
%>
لاحظ أنه يجب تحديد Response.ContentType="image/*" قبل الإخراج إلى المتصفح.
لكي تظهر الصورة بشكل طبيعي
آخر شيء يجب ملاحظته هو أن المعالجة في ملفprocess.asp الخاص بي لا تأخذ في الاعتبار وجود بيانات أخرى في الصفحة الأولى (upload.htm)، مثل <INPUT type=tesxt name=userid>، وما إلى ذلك، إذا هناك هذه العناصر، يجب على ملف Process.asp الخاص بك الانتباه إلى معالجة البيانات غير الضرورية.