upload รูปภาพ พยายามจะอัพโหลดรูปภาพลงฐานข้อมูลค่ะ Error Type: Provider (0x80040E21) Multiple-step OLE DB operation generated errors.
พยายามจะอัพโหลดรูปภาพลงฐานข้อมูลค่ะ
Error Type:
Provider (0x80040E21)
Multiple-step OLE DB operation generated errors. Check each OLE DB status value, if available. No work was done.
/WebBoard/rest/questionSave.asp, line 38
ได้โค้ดจากบทเรียน แต่ในบทเรียนมีตัวอย่างแค่อัพโหลดรูปภาพ ตอนนี้กำลังพยายามนำชื่อไฟล์ไปเก็บไว้ในฐานข้อมูลค่ะ เซ็ตใน access ชื่อฟิลด์สำหรับเก็บชื่อไฟล์คือ q_pic เช็ตชนิดของข้อมูลเป็น OLE Object ตอนเซพข้อมูลมันเออเร่อค่ะ
------------------------------------------------------------------------
newquestion.asp
ฟอร์มสำหรับ browse รูปภาพ
File Name: <input type="text" name="filename" size="30" ><br>
<input type="file" name="file" size="30">
------------------------------------------------------------------------------
questionsave.asp
<meta http-equiv="Content-Type" content="text/html; charset=windows-874">
<!--#include file = "connect.asp"-->
<!--#Include File="uploads.asp"-->
<%
if uploaddata.Item("name").Item("value")="" then response.Redirect("newquestion.asp")
'Else 'save and upload picture
filename=uploaddata.Item("file").Item("filename")
pos_filebegin=InStrRev(filename,"\")
pos_fileend=Len(filename)
filename_new=Mid(filename,pos_filebegin+1,pos_fileend-pos_filebegin)
' Set file which can be upload
If Instr(filename_new,".jpg")<>0 Or Instr(filename_new,".gif")<>0 Or Instr(filename_new,".jpeg")<>0 Then
Set fs=Server.CreateObject("Scripting.FileSystemObject")
Set uploadfile=fs.CreateTextFile(Server.Mappath("picture"&"/"&filename_new))
uploadfile.Write uploaddata.Item("file").Item("value")
uploadfile.Close
set fs=Nothing
End If
sql ="select * from question"
set rs = server.CreateObject("ADODB.RECORDSET")
rs.open sql,connect,1,3
rs.AddNew
rs("q_name")=uploaddata.Item("name").Item("value")
rs("q_sex")=uploaddata.Item("mode").Item("value")
rs("q_date") = year(now)&"/"&month(now)&"/"&day(now)&" "&time
rs("q_ip") = request.ServerVariables("REMOTE_ADDR")
rs("q_topic")=uploaddata.Item("topic").Item("value")
rs("q_detail")=uploaddata.Item("message").Item("value")
rs("q_file")=uploaddata.Item("filename").Item("value")
rs("q_pic")=uploaddata.Item("file").Item("value") ====เออเร่อบรรทัดนี้
rs.Update
rs.Close
Response.write("ºÑ¹·Ö¡àÃÕºÃéÍÂ")
'End If%>
<%'end if%>
<script>
window.location="showdetail.asp";
</script>
ใครทราบช่วยแนะนำหน่อยค่ะ คือในตัวอย่างบทเรียนจะมีไฟล์ "uploads.asp" include ด้วยแล้วบอกว่า หากต้องการ นำชื่อไฟล์ไปเก็บไว้ในฐานข้อมูล ให้ทำการ Add ชื่อไฟล์ filename_new ลงในฐานข้อมูล จากนั้นเมื่อต้องการนำรูปภาพมาแสดงในอ้างอิง Path Picture / filename_new
เขียนโค้ดให้ดูด้วยก็ดีค่ะ เพราะไม่เข้าใจ ขอบคุณค่ะ Tag : - - - -
Date :
8 ม.ค. 2549 20:06:48
By :
piangw
View :
3605
Reply :
8
Form.htm
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-874">
<title>Input Objects + Multiple Upload</title>
</head>
<body bgcolor="#C0C0C0">
<form action="Uploads.asp" method="post" ENCTYPE="multipart/form-data">
<div align="center">
<table width="650" border=1>
<tr>
<td width="150" align="right">หมวดสินค้า : </td>
<td width="400">
<Select Name="pCat" size=1>
<option value="Web Application">Web Application</option>
<option value="Hardware Price">Hardware Price</option>
<option value="Accessories">Accessories</option>
<option value="Special">Special</option>
</Select>
</td>
</tr>
<tr>
<td width="150" align="right"> ชื่อผลิตภัณฑ์ : </td>
<td width="400"><input type="text" name="pName" size="40"></td>
</tr>
<tr>
<td>test</td>
<td><input type="text" name="ptest"></td>
</tr>
<tr>
<td width="150" align="right"> ตัวเลือก CheckBox : </td>
<td width="400">
<input type="checkbox" name="chkName">Check 1
<input type="checkbox" name="chkName2">Check 2
<input type="checkbox" name="chkName3">Check 3
<input type="checkbox" name="chkName4">Check 4
</td>
</tr>
<tr>
<td width="150" align="right"> ตัวเลือก Radio : </td>
<td width="400">
<input type="radio" name="radName">Radio 1
<input type="radio" name="radName">Radio 2
<input type="radio" name="radName">Radio 3
<input type="radio" name="radName">Radio 4
</td>
</tr>
<tr>
<td width="150" align="right"> File : </td>
<td width="400"><input Type="file" Name="selFile1"Size=40></td>
</tr>
<tr>
<td width="150" align="right"> File : </td>
<td width="400"><input Type="file" Name="selFile2"Size=40></td>
</tr>
<tr>
<td width="150" align="right"> File : </td>
<td width="400"><input Type="file" Name="selFile3"Size=40></td>
</tr>
<tr>
<td width="150" align="right"> File : </td>
<td width="400"><input Type="file" Name="selFile4"Size=40></td>
</tr>
<tr>
<td width="550" align="center" colspan="2"> <input type="submit" value="ส่งข้อมูล">
<input type="reset" value="ลบข้อมูล"></td>
</tr>
</table>
</center>
</div>
</form>
<% end if %>
</body>
</html>
upload.asp
<%
Option Explicit
Server.ScriptTimeOut = 180
Dim bData
Dim data
Dim i
Dim delimiter
Dim eorequest
Dim bo2ndline
Dim eon_1thline
Dim lodata
Dim dataitemisfile
Dim fnametoken
Dim bofname
Dim eofname
Dim lofname
Dim fname
Dim path
Dim fso
Dim file
Dim boname
Dim loname
bdata = request.binaryread(request.totalbytes)
data = ""
for i = 1 to lenb(bdata)
data = data & chr(ascb(midb(bdata, i, 1)))
next
delimiter = vbnewline & mid(data, 1, instr(data, vbnewline) + 1)
eorequest = replace(delimiter, vbnewline, "--", 2)
bo2ndline = instr(data, vbnewline) + 2
eon_1thline = instrrev(data, eorequest) - 1
lodata = eon_1thline - bo2ndline
data = mid(data, bo2ndline, lodata)
data = split(data, delimiter)
for i = 0 to ubound(data)
data(i) = split(data(i), vbnewline & vbnewline)
dataitemisfile = false
fnametoken = instr(data(i)(0), "filename=")
if ((fnametoken <> 0) and (len(trim(data(i)(1))) <> 0)) then
eofname = instr(fnametoken, data(i)(0), vbnewline) - 1
bofname = instrrev(data(i)(0), "\", eofname) + 1
lofname = eofname - bofname
fname = mid(data(i)(0), bofname, lofname)
path = server.mappath("uploads\" & fname)
set fso = server.createobject("scripting.filesystemobject")
set file = fso.CreateTextFile(path, true)
file.write data(i)(1)
file.close
set file = nothing
set fso = nothing
data(i)(1) = fname
dataitemisfile = true
Response.Write "<a href='uploads\" & fname & "' target='_blank'>" & fname & "</a><BR>"
end if
boname = instr(data(i)(0), """") + 1
loname = instr(boname, data(i)(0), """") - boname
data(i)(0) = mid(data(i)(0), boname, loname)
Response.Write data(i)(0) & " : " & data(i)(1) & "<HR>"
next
%>
ตามตัวอย่างให้สร้าง folder ว่า Uploads ไว้ด้วย
แต่ถ้าต้องการเปลี่ยนชื่อ folder ก็แก้ไขใน code ได้ครับ
วิธีนี้เป็นการส่งข้อมูลแบบ binary แต่วิธีนี้จะมีข้อเสียคือช้า และกินทรัพยากรค่อนข้างเปลือง
ขออนุญาตแนะนำนะครับ
ผมสงสัยว่าทำไมต้อง Upload ลงฐานข้อมูลด้วยครับ เพราะจะทำให้ฐานข้อมูลใหญ่
ทำไมไม่เก็บเฉพาะชื่อไฟล์ลงฐานข้อมูล ส่วนไฟล์ก็เก็บลงfolder จะลดขนาดฐานข้อมูลได้เยอะ และเร็วด้วย
ถ้าหากเครื่องที่คุณทดสอบ หรือ server สามารถติดตั้งโปรแกรมเพิ่มเติมได้
ผมแนะนำให้ใช้ component เกี่ยวกับ Upload ดีกว่าครับ เพราะจะทำให้การ upload เร็วขึ้น และเขียนโปรแกรมไม่ซับซ้อนด้วยครับ
Component ที่ผมเคยเอามาติดตั้งก็คือ ASP Smart Upload
ที่ thaicreat นี่ก็มีครับ (จะอยู่ในกรอบสี่เหลี่ยมด้านบนเหนือกระทู้นะครับ)
Date :
9 ม.ค. 2549 08:54:49
By :
menamya
ขอบคุณค่ะ แต่แหม ช่วยแก้โค้ดบรรทัดที่มันเออเร่อไม่ได้เหรอคะ เพราะพยายามมานานแล้ว
Date :
10 ม.ค. 2549 09:06:21
By :
piangw
สวัสดีครับ
เอ.. ที่พี่ให้เปลี่ยนเป็น ole ใช่ไม่ได้เหรอ ของพี่ลองทุกอย่างใช้ได้หมดแล้วนะ
ตอบคุณ menamya ครับ
การ Upload ลงฐานข้อมูลมีส่วนดีในเรื่องการจัดการ มากกว่าเยอะครับ ทั้งในเรื่องการ ค้นหา การลบ ง่ายกว่ากันเยอะมากครับ แถมยังเป็นระเบียบกว่าด้วยครับ ผมทำมาทั้งสองแบบ upload ไปทิ้งไว้ใน folder เมื่อ งานเยอะขึ้น ขยะใน folder จะเยอะมาก เนื่องจากการจัดการกับ file ใบ folder ไม่ดีเท่า การจัดการฐานข้อมูล ส่วนเร็วนี่ผมว่าไม่ต่างกันครับ เพราะไม่ว่าจะเป็นอะไร ใช้ component หรือ ไม่ใช่ การส่งข้อมูล upload มันก็ไม่ได้ช่วยอะไรเลย ผมลองยกตัวอย่าง คือcomponent ไม่ได้ช่วยให้การส่งภาพเข้า Database หรือ ขึ้น Server เร็วกว่า กันครับ เพราะขนาดต่างหากที่กำหนดความเร็วช้า ส่วนการจัดการ หรือ logic ที่ code ต่างหาก ที่ทำให้ server ทำงานเร็วหรือช้า
ขออภัย ถ้าผมผิดรบกวน ต่อว่าผมหน่อยครับ ผมคิดว่าน่าจะเป็นแบบนี้
Wiwat Keawsook
MSN : [email protected]
Yahoo : [email protected]
Google Talk : [email protected]
QQ : 67176
ICQ : 36338120
Date :
10 ม.ค. 2549 20:59:47
By :
Wiwat K.
สวัสดีค่ะ พี่วิวัฒน์
ยังใช้ไม่ได้เลยค่ะ ไม่รู้เป็นเพราะอะไร ก็เลยลองดูไปเรื่อยๆ ว่าจะเมล์ไปทวงโค้ดที่พี่ดูให้ ก็กลัวจะรบกวนพี่ช่วงวันหยุดน่ะค่ะ ถ้าพี่ยังเก็บไว้อยู่ช่วยรบกวนส่งมาให้ได้ไหมคะ หรือถ้าไม่ได้เก็บไว้แล้ว ถ้าจำได้รบกวนช่วยบอกช่วงที่ทำผิดหน่อยได้ไม๊คะ ขอบคุณมากๆค่ะ
Date :
11 ม.ค. 2549 11:11:14
By :
piangw
ชี้แจง
ผมขอแยกเป็น 2 เรื่องนะครับ คือ
เรื่องวิธีการ upload ลงฐานข้อมูล ระหว่างวิธีแบบ binary กับ แบบ component
เรื่องการเก็บข้อมูลลงฐานข้อมูลกับลงใน folder
เรื่องวิธีการ Upload สาเหตุที่ผมแนะนำแบบการใช้ component เนื่องจาก
ผมมีโจทย์ที่ต้องทำงาน ซึ่งต้องมีการ upload รูปภาพ พร้อมข้อมูล ซึ่งผมเองก็ไม่อยากไปยุ่งอะไรกับ server จึงเลือกใช้วิธีแบบ binary การupload ต้องสามารถ upload รูปภาพพร้อมกันสูงสุด 3 ไฟล์ พร้อมข้อมูลทีอยู่ใน textbox อีก 10 fields
server ที่ใช้ เป็น window 2000 เชื่อมต่อ network แบบ intranet
*การทดสอบนี้ เป็นการทดสอบเพื่อทำการส่งข้อมูลไปยัง server เก็บไว้ใน folder
การทดสอบ เมื่อส่งข้อมูลแบบ binary พร้อมภาพจำนวน 3 ภาพ ภาพละ 20 kb การทดสอบเป็นไปอย่างดี
การทดสอบ เมื่อส่งข้อมูลแบบ binary พร้อมภาพจำนวน 3 ภาพ ภาพละ 80 kb การทดสอบเป็นไปอย่างดี
การทดสอบ เมื่อส่งข้อมูลแบบ binary พร้อมภาพจำนวน 3 ภาพ ภาพละ 120 kb การทดสอบเริ่มไม่ค่อยเสถียร (ต้องใช้เวลานานขึ้นเพื่อเปลี่ยนเป็น page แจ้งผล upload ในการ upload จำนวน 10 ครั้ง เป็นไปอย่างสมบูรณ์เพียง 3 ครั้ง)
การทดสอบ เมื่อส่งข้อมูลแบบ binary พร้อมภาพจำนวน 3 ภาพ ภาพละ 200 kb การทดสอบไม่ผ่าน ใช้เวลานานมากเป็นนาที และข้อมูลที่ตรวจสอบพบว่าบางไฟล์ปรากฏชื่อแต่มีขนาด 0 kb)
การทดสอบ เมื่อส่งข้อมูลแบบ binary พร้อมภาพจำนวน 3 ภาพ ภาพละ 1.2 mb การทดสอบไม่ผ่าน ได้ผลเหมือนการทดสอบแบบ 200 kb)
ซึ่งงานของผมจำเป็นต้องใช้ภาพไม่เกิน 200 kb
จากการทดสอบดังกล่าว วิธีbinary ทำให้ผมพบปัญหา ผมจึงลงทดสอบด้วยการใช้ component (ซึ่งตอนแรกผมไม่อยากใช้ component เพราะว่าไม่อยากไปลง component ที่ server เพราะ server ไม่ใช่ของผม)
ผมจึงติดตั้ง component ASP Smart Upload
การทดสอบ ทดสอบแบบเดียวกับแบบ binary
การทดสอบ เมื่อส่งข้อมูลแบบ component พร้อมภาพจำนวน 3 ภาพ ภาพละ 20 kb การทดสอบเป็นไปอย่างดี
การทดสอบ เมื่อส่งข้อมูลแบบ component พร้อมภาพจำนวน 3 ภาพ ภาพละ 80 kb การทดสอบเป็นไปอย่างดี
การทดสอบ เมื่อส่งข้อมูลแบบ component พร้อมภาพจำนวน 3 ภาพ ภาพละ 120 kb การทดสอบเป็นไปอย่างดี(ใช้เวลาประมาณ1-2 วินาที)
การทดสอบ เมื่อส่งข้อมูลแบบ component พร้อมภาพจำนวน 3 ภาพ ภาพละ 200 kb การทดสอบเป็นไปอย่างดี(ใช้เวลาประมาณ1-2 วินาที)
การทดสอบ เมื่อส่งข้อมูลแบบ component พร้อมภาพจำนวน 3 ภาพ ภาพละ 1.2 mb การทดสอบเป็นไปอย่างดี(ใช้เวลาไม่เกิน5วินาที)
ดังนั้นผมจึงสรุปผลการทดสอบ (ในความคิดของผม) การทดสอบแบบ binary เหมาะสมกับ การ upload ในกรณีที่ต้องการส่งข้อมูลที่มีปริมาณของขนาดในการส่งไม่มาก(ไม่เกิน400kb)ต่อการส่ง 1 ครั้ง
แต่ถ้ามีความจำเป็นที่ต้องส่งข้อมูลที่มีปริมาณมาก (เกิน 400kb) ต่อครั้ง ต้องใช้ component เป็นตัวช่วยในการ upload ข้อมูล (ซึ่งก็ต้องติดตั้งเพิ่ม หรือ server ที่ใช้ต้องมี component รองรับการ upload)
------------------------------------------------------------------------------------------------------------
ส่วนเรื่องการเก็บข้อมูลลงฐานข้อมูล กับการเก็บลง folder
เมื่อต้องการแก้ไขข้อมูลหรือลบ ข้อมูล
เมื่อเก็บลงฐานข้อมูล สามารถจัดการได้ง่าย
แต่ที่ผมเลือกวิธีการจัดเก็บแบบลง Folder เพื่อไม่ให้ฐานข้อมูลมีขนาดใหญ่ เพราะข้อมูลผมที่ใช้ ถ้าเอาภาพไปรวมด้วย ใน 1 เรคคอร์ด ก็จะมีขนาดประมาณ 700 kb) ซึ่งทำให้ DB มีขนาดใหญ่มาก ผมจึงเลือกวิธีการเก็บเป็น text ไฟล์ โดยเก็บเป็นชื่อไฟล์
ส่วนภาพที่ upload ไปแล้วและถ้าต้องการแก้ไข record โดยเปลี่ยนภาพใหม่
ถ้าเป็นแบบเก็บในฐานข้อมูลก็เปลี่ยนได้ทันที
แต่วิธีเก็บลง folder ก็จะพบกับปัญหาว่าต้องไปลบกับข้อมูลที่ไม่ได้ใช้ ทำให้เกิดไฟล์ภาพที่ไม่ต้องการได้
ถ้าหากใครรู้วิธีการสั่งลบไฟล์โดยใช้คำสั่ง asp หรือ java ก็ช่วยบอกด้วยครับ
Date :
14 ม.ค. 2549 11:19:01
By :
menamya
ตอบคุณ piangw ครับ
การอัพโหลดแบบไบนารี เพื่อให้เก็บรูปภาพลงฐานข้อมูลนั้น วิธีที่คุณเพิ่มเข้าไปสำหรับฟิลด์รูปภาพนั้น รู้สึกว่าจะไม่ถูกต้องนะครับ ที่ผมเคยทำเป็นแบบนี้ครับ.......
Data = file2
Datachunk = Data & chrB(0)
rs.Fields("FileData").appendChunk Datachunk '-------ฟิลด์ Data
rs("FileType") = contentType2 '------ฟิลด์ประเภทไฟล์
rs("FileName") = filename2 '------------ฟิลด์ชื่อไฟล์รูปภาพ
Date :
5 ก.พ. 2549 19:48:00
By :
dev
ขอบคุณทุกคำตอบค่ะ
Date :
10 ก.พ. 2549 08:47:25
By :
piangw
ขอโค้ดที่เขียนด้วย C#ได้ป่ะค่ะใช้กับ asp นะค่ะ ไม่รู้จะต้องเริ่มทำยังไง ช่วยอธิบายอย่างละเอียดได้มั๊ยค่ะ การ uplode ข้อมูล
upload ข้อมูลต่างๆอ่ะค่ะ เก็บชื่อไว้ฐานข้อมูล แต่เก็บไฟล์ไว้ในโฟล์เดอร์ค่ะ
Date :
6 ก.พ. 2551 16:55:07
By :
BamBoo
Load balance : Server 01