Autor: Zhui Feng
verwendet ASP seit langem zum Schreiben von Website-Anwendungen. Unter diesen ist das Hochladen von Dateien wahrscheinlich das häufigste Problem, insbesondere das Hochladen von Bildern Wenn Sie eine „Ein Stern pro Tag“-Funktion ähnlich der von der virtuellen NetEase-Community bereitgestellten Funktion in Ihrer eigenen Community implementieren möchten, müssen Sie Internetnutzern die Funktion zum Hochladen von Fotos bereitstellen. Um Bilddateien auf den Server hochzuladen, können Sie verschiedene kostenlose Datei-Upload-Komponenten verwenden. In vielen Fällen können wir jedoch nur kostenlosen ASP-unterstützten Speicherplatz verwenden oder den virtuellen Speicherplatz anderer Personen mieten Für uns ist es einfach unmöglich, die Datei-Upload-Komponente zu nutzen; im zweiten Fall müssen wir auch viel „Geld“ bezahlen. Sofern Sie nicht über einen eigenen virtuellen Host verfügen, können Sie die benötigten Komponenten problemlos auf dem Server installieren. Diese Situation ist für die meisten Menschen unerreichbar. Dann können wir nichts tun? Haha, die Antwort ist ja (natürlich ja, sonst könnte ich diesen Artikel nicht schreiben). Lassen Sie uns reinen ASP-Code verwenden, um die Funktion zum Hochladen und Speichern von Bildern in der Datenbank zu implementieren (übrigens implementieren wir auch die Funktion zum Anzeigen von Bildern in der Datenbank auf der Webseite).
Machen wir uns zunächst mit den Objektmethoden vertraut, die wir verwenden werden. Im Allgemeinen verwenden wir das Request-Objekt, um die von der vorherigen Seite übergebenen Daten abzurufen. Ebenso können wir das Request-Objekt verwenden, um die hochgeladenen Dateidaten abzurufen. Die verwendete Methode ist Request.BinaryRead(). Die Methode, mit der wir die Bilddaten aus der Datenbank lesen und auf der Webseite anzeigen, ist:
Request.BinaryWrite(). Wenn wir die Bilddaten abrufen und in der Datenbank speichern, können wir die Insert-Anweisung nicht direkt zum Betreiben der Datenbank verwenden. Stattdessen müssen wir die AppendChunk-Methode von ADO verwenden GetChunk-Methode. Die spezifische Syntax jeder Methode lautet wie folgt:
*Request.BinaryRead-Syntax:
variant=Request.BinaryRead(count)
Parameter
Variante
Der Rückgabewert enthält die vom Client gelesenen Daten.
zählen
Gibt die Datenmenge an, die vom Client gelesen werden soll. Dieser Wert ist kleiner oder gleich der mit der Request.TotalBytes-Methode erhaltenen Datenmenge.
*Request.BinaryWrite-Syntax:
Request.BinaryWritedata
Parameter
Daten
Das Paket, das in den Client-Browser geschrieben werden soll.
*Request.TotalBytes-Syntax:
Variante=Request.TotalBytes
Parameter
Variante
Gibt die Anzahl der vom Client gelesenen Datenbytes zurück.
*AppendChunk-Syntax hängt Daten an einen großen Text, ein binäres Datenfeld oder ein Parameterobjekt an.
object.AppendChunkData
Parameter
objectField oder Parameterobjekt
Datenvariantentyp, der an das Objekt angehängte Daten enthält.
Beschreibung Verwenden Sie die AppendChunk-Methode des Field- oder Parameter-Objekts, um lange Binär- oder Zeichendaten in das Objekt einzugeben. Wenn der Systemspeicher begrenzt ist, können Sie die AppendChunk-Methode verwenden, um einige, aber nicht alle Vorgänge für lange Ganzzahlwerte auszuführen.
Die *GetChunk-Syntax gibt den gesamten oder einen Teil des Inhalts eines großen Text- oder Binärdatenfeldobjekts zurück.
variable=field.GetChunk(Größe)
Der Rückgabewert gibt den Variantentyp zurück.
Parameter
Größe eines langen ganzzahligen Ausdrucks, gleich der Anzahl der abzurufenden Bytes oder Zeichen.
Beschreibung Verwenden Sie die GetChunk-Methode des Field-Objekts, um einige oder alle seiner langen Binär- oder Zeichendaten abzurufen. Wenn der Systemspeicher begrenzt ist, können Sie die GetChunk-Methode verwenden, um einige, aber nicht alle langen Ganzzahlwerte zu verarbeiten.
Die vom GetChunk-Aufruf zurückgegebenen Daten werden der „Variable“ zugewiesen. Wenn die Größe größer als die verbleibenden Daten ist, dann
GetChunk gibt einfach die restlichen Daten zurück, ohne die „Variable“ mit Leerzeichen zu füllen. Wenn das Feld leer ist, dann
Die GetChunk-Methode gibt Null zurück.
Jeder nachfolgende GetChunk-Aufruf ruft Daten ab der Stelle ab, an der der vorherige GetChunk-Aufruf aufgehört hat. Wenn Sie jedoch Daten aus einem Feld abrufen und dann den Wert eines anderen Felds im aktuellen Datensatz festlegen oder lesen, geht ADO davon aus, dass die Daten aus dem ersten Feld abgerufen wurden. Wenn die GetChunk-Methode für das erste Feld erneut aufgerufen wird, interpretiert ADO den Aufruf als neuen GetChunk-Vorgang und beginnt mit dem Lesen vom Anfang des Datensatzes. Wenn das andere Recordset-Objekt keine Kopie des ersten Recordset-Objekts ist, wird der GetChunk-Vorgang durch den Zugriff auf darin enthaltene Felder nicht unterbrochen.
Wenn das adFldLong-Bit in der Attributes-Eigenschaft des Field-Objekts auf True gesetzt ist, können Sie die GetChunk-Methode für das Feld verwenden.
Wenn bei Verwendung der Getchunk-Methode für ein Feldobjekt kein aktueller Datensatz vorhanden ist, wird der Fehler 3021 (Kein aktueller Datensatz) generiert.
Als nächstes entwerfen wir unsere Datenbank. Als Test sieht unsere Datenbankstruktur wie folgt aus (access2000):
Feldname, Typ, Beschreibung, ID, automatische Nummer, Primärschlüsselwert
Das OLE-Objekt img wird zum Speichern von Bilddaten verwendet
Für MSSQLServer7 lautet die entsprechende Struktur wie folgt:
Feldname Typ Beschreibung id int (Identität) Primärschlüsselwert
img image wird zum Speichern von Bilddaten verwendet
Jetzt beginnen wir, den Upload-Teil unseres reinen ASP-Codes offiziell zu schreiben. Zunächst stellen wir dem Benutzer eine Upload-Schnittstelle zur Verfügung, die es dem Benutzer ermöglicht, das hochzuladende Bild auszuwählen. Der Code lautet wie folgt (upload.htm):
<html>
<Körper>
<Mitte>
<form name="mainForm" enctype="multipart/form-data" action="process.asp" method=post>
<inputtype=filename=mefile><br>
<inputtype=submitname=okvalue="OK">
</form>
</center>
</body>
</html>
Beachten Sie, dass enctype="multipart/form-data" dieses Attribut im Formular haben muss, andernfalls werden die hochgeladenen Daten nicht abgerufen. Als Nächstes müssen wir die erforderliche Verarbeitung der vom Browser in Process.asp erhaltenen Daten durchführen, da die Daten, die wir in Process.asp erhalten, nicht nur die Daten der hochgeladenen Bilder enthalten, die wir möchten, sondern auch andere nutzlose Informationen enthalten, die wir benötigen um redundante Daten zu eliminieren und die verarbeiteten Bilddaten in der Datenbank zu speichern. Hier nehmen wir access2000 als Beispiel. Der spezifische Code lautet wie folgt (process.asp):
<%
Antwort.buffer=true
formsize=request.totalbytes
formdata=request.binaryread(formsize)
bncrlf=chrB(13)&chrB(10)
Divider=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=nichts
setconnGraph=nichts
%>
Okay, jetzt haben wir die hochgeladenen Bilder in einer Datenbank namens images.mdb gespeichert. Die verbleibende Arbeit besteht darin, die Bilddaten in der Datenbank auf der Webseite anzuzeigen. Im Allgemeinen wird in HTML das <IMG>-Tag zum Anzeigen von Bildern verwendet, d. h. <IMGSRC="image path">, aber unsere Bilder werden in der Datenbank gespeichert. Was ist der „Bildpfad“? Haha, tatsächlich kann dieses SRC-Attribut nicht nur den Pfad angeben, sondern auch so verwendet werden:
<IMGSRC="showimg.asp?id=xxx">
Wir müssen also nur die qualifizierten Daten aus der Datenbank in showimg.asp lesen und an das SRC-Attribut zurückgeben. Der spezifische Code lautet wie folgt (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(request("id"))
rec.openstrsql,connGraph,1,1
Response.ContentType="image/*"
Response.BinaryWriterc("img").getChunk(7500000)
rec.close
setrec=nichts
setconnGraph=nichts
%>
Beachten Sie, dass Response.ContentType="image/*" vor der Ausgabe an den Browser angegeben werden muss.
um das Bild normal anzuzeigen.
Das Letzte, was zu beachten ist, ist, dass die Verarbeitung in meiner Datei „process.asp“ nicht berücksichtigt, dass auf der ersten Seite (upload.htm) andere Daten vorhanden sind, z. B. <INPUT type=tesxt name=userid> usw., wenn Wenn diese Elemente vorhanden sind, sollte Ihr Prozess.asp darauf achten, unnötige Daten zu verarbeiten.