Autor: Zhui Feng
usa ASP para escrever aplicativos de sites há muito tempo. É inevitável que você encontre vários problemas. Entre eles, como fazer upload de arquivos para o servidor é provavelmente o problema mais comum, especialmente o upload de fotos. , se você deseja implementar uma função "uma estrela por dia" semelhante à fornecida pela comunidade virtual NetEase em sua própria comunidade, você deve fornecer a função para que os internautas façam upload de fotos. Para fazer upload de arquivos de imagem para o servidor, você pode usar vários componentes gratuitos de upload de arquivos. Embora sejam muito poderosos, em muitos casos, só podemos usar espaço gratuito com suporte ASP ou alugar espaço virtual de outras pessoas. simplesmente impossível usarmos o componente de upload de arquivos; já no segundo caso, também temos que pagar muito "dinheiro". A menos que você tenha seu próprio host virtual, você pode instalar facilmente os componentes necessários no servidor. Essa situação está fora do alcance da maioria das pessoas. Então não há nada que possamos fazer? Haha, a resposta é sim (claro que sim, caso contrário não conseguiria escrever este artigo). Vamos usar código ASP puro para implementar a função de fazer upload de imagens e salvá-las no banco de dados (aliás, também implementamos a função de exibir imagens do banco de dados na página web).
Primeiro, vamos nos familiarizar com os métodos de objeto que usaremos. Geralmente usamos o objeto Request para obter os dados passados da página anterior. Da mesma forma, também podemos usar o objeto Request para obter os dados do arquivo carregado. O método usado é Request.BinaryRead(). O método que usamos para ler os dados da imagem do banco de dados e exibi-los na página da web é:
Solicitação.BinaryWrite(). Quando obtemos os dados da imagem e os salvamos no banco de dados, não podemos usar diretamente a instrução Insert para operar o banco de dados. Em vez disso, devemos usar o método AppendChunk do ADO. Da mesma forma, para ler os dados da imagem no banco de dados, devemos usar. Método GetChunk. A sintaxe específica de cada método é a seguinte:
*Sintaxe Request.BinaryRead:
variante=Request.BinaryRead(contagem)
parâmetro
variante
O valor de retorno contém os dados lidos do cliente.
contar
Indica a quantidade de dados a serem lidos do cliente. Este valor é menor ou igual à quantidade de dados obtidos através do método Request.TotalBytes.
*Sintaxe Request.BinaryWrite:
Solicitação.BinaryWritedata
parâmetro
dados
O pacote a ser gravado no navegador do cliente.
*Sintaxe Request.TotalBytes:
variante=Request.TotalBytes
parâmetro
variante
Retorna o número de bytes de dados lidos do cliente.
* A sintaxe AppendChunk anexa dados a um texto grande, campo de dados binários ou objeto de parâmetro.
objeto.AppendChunkData
parâmetro
objectField ou objeto Parâmetro
Tipo de variante de dados, contendo dados anexados ao objeto.
Descrição Use o método AppendChunk do objeto Field ou Parameter para preencher dados binários ou de caracteres longos no objeto. Quando a memória do sistema é limitada, você pode usar o método AppendChunk para executar algumas, mas não todas, operações em valores inteiros longos.
*A sintaxe GetChunk retorna todo ou parte do conteúdo de um objeto campo de texto grande ou de dados binários.
variável=campo.GetChunk(Tamanho)
O valor de retorno retorna o tipo de variante.
parâmetro
Expressão de número inteiro longo de tamanho, igual ao número de bytes ou caracteres a serem recuperados.
Descrição Use o método GetChunk do objeto Field para recuperar alguns ou todos os seus dados binários ou de caracteres longos. Quando a memória do sistema é limitada, você pode usar o método GetChunk para processar alguns, mas não todos, valores inteiros longos.
Os dados retornados pela chamada GetChunk serão atribuídos à "variável". Se Size for maior que os dados restantes, então
GetChunk apenas retorna os dados restantes sem preencher a "variável" com espaços em branco. Se o campo estiver vazio, então
O método GetChunk retorna Nulo.
Cada chamada GetChunk subsequente recuperará dados começando onde a chamada GetChunk anterior parou. Entretanto, se você recuperar dados de um campo e depois definir ou ler o valor de outro campo no registro atual, o ADO assumirá que os dados foram recuperados do primeiro campo. Se o método GetChunk for chamado novamente no primeiro campo, o ADO interpretará a chamada como uma nova operação GetChunk e iniciará a leitura desde o início do registro. Se o outro objeto Recordset não for uma cópia do primeiro objeto Recordset, o acesso aos campos nele não interromperá a operação GetChunk.
Se o bit adFldLong na propriedade Atributos do objeto Field estiver definido como True, você poderá usar o método GetChunk no campo.
Se não houver nenhum registro atual ao utilizar o método Getchunk em um objeto Field, será gerado o erro 3021 (No Current Record).
A seguir, vamos projetar nosso banco de dados como teste, nossa estrutura de banco de dados é a seguinte (access2000):
Nome do campo tipo descrição id número automático valor da chave primária
img O objeto OLE é usado para salvar dados de imagem
Para MSSQLServer7, a estrutura correspondente é a seguinte:
Nome do campo tipo descrição id int (Identidade) valor da chave primária
imagem img é usada para salvar dados de imagem
Agora começamos a escrever formalmente a parte de upload do nosso código ASP puro. Primeiro, temos uma interface de upload fornecida ao usuário, que permite ao usuário selecionar a imagem a ser carregada. O código é o seguinte (upload.htm):
<html>
<corpo>
<centro>
<form name="mainForm" enctype="multipart/form-data" action="process.asp" método=post>
<inputtype=nomedoarquivo=mearquivo><br>
<inputtype=submitname=okvalue="OK">
</form>
</centro>
</body>
</html>
Observe que enctype="multipart/form-data" deve ter este atributo no Form, caso contrário os dados enviados não serão obtidos. Em seguida, precisamos realizar o processamento necessário nos dados obtidos do navegador em process.asp, pois os dados que obtemos em process.asp não contêm apenas os dados das imagens enviadas que desejamos, mas também contém outras informações inúteis, precisamos para eliminar dados redundantes e salvar os dados da imagem processada no banco de dados. Aqui tomamos o access2000 como exemplo. O código específico é o seguinte (process.asp):
<%
resposta.buffer=true
tamanho do formulário = solicitação.totalbytes
formdata = request.binaryread (tamanho do formulário)
bncrlf=chrB(13)&chrB(10)
divisor=esquerdaB(formdata,clng(instrb(formdata,bncrlf))-1)
datastart=instrb(formdata,bncrlf&bncrlf)+4
dataend=instrb(datastart+1,formdata,divisor)-datastart
meusdados=midb(formdata,datastart,dataend)
setconnGraph=server.CreateObject("ADODB.conexão")
connGraph.ConnectionString="driver={MicrosoftAccessDriver(*.mdb)};DBQ="&server.MapPath("images.mdb")&";uid=;PWD=;"
connGraph.Open
setrec=server.createobject("ADODB.recordset")
rec.Open"SELECT*FROM[imagens]whereidisnull",connGraph,1,3
rec.addnew
rec("img").appendchunkmydata
rec.atualização
rec.fechar
setrec = nada
setconnGraph = nada
%>
Ok, agora salvamos as imagens enviadas em um banco de dados chamado images.mdb. O trabalho restante é exibir os dados da imagem no banco de dados na página da web. Geralmente, em HTML, a tag <IMG> é usada para exibir imagens, ou seja, <IMGSRC="caminho da imagem">, mas nossas imagens são salvas no banco de dados. Haha, na verdade, além de especificar o caminho, esse atributo SRC também pode ser usado assim:
<IMGSRC="showimg.asp?id=xxx">
Portanto, basta ler os dados qualificados do banco de dados em showimg.asp e devolvê-los ao atributo SRC. O código específico é o seguinte (showimg.asp):
<%
setconnGraph=server.CreateObject("ADODB.conexão")
connGraph.ConnectionString="driver={MicrosoftAccessDriver(*.mdb)};DBQ="&
server.MapPath("imagens.mdb")&";uid=;PWD=;"
connGraph.Open
setrec=server.createobject("ADODB.recordset")
strsql="selectimgfromimageswhereid="&trim(request("id"))
rec.openstrsql,connGraph,1,1
Response.ContentType="imagem/*"
Response.BinaryWriterec("img").getChunk(7500000)
rec.fechar
setrec = nada
setconnGraph = nada
%>
Observe que Response.ContentType="image/*" deve ser especificado antes de enviar para o navegador.
para exibir a imagem normalmente.
A última coisa a observar é que o processamento em meu process.asp não leva em consideração que existem outros dados na primeira página (upload.htm), como <INPUT type=tesxt name=userid>, etc., se existem esses itens, seu process.asp deve prestar atenção ao processamento de dados desnecessários.