ASP (Active Server Page) é um produto da Microsoft Por ser fácil de programar e poder desenvolver rapidamente sites dinâmicos com funções poderosas, muitos sites (especialmente intranets/extranets) agora adotam o modelo NT+IIS+ASP, tornando o ASP o modelo. atual A linguagem de script mais popular para desenvolvimento de sites. Nos serviços WEB, o serviço de upload de arquivos é uma função muito comum, mas o PWS no WIN9X não fornece componentes relacionados no IIS no NT fornece um Post; Componente aceitador, mas não é fácil de usar porque verifica os direitos de acesso WWW do usuário. Você também pode baixar componentes relacionados da Internet, mas a maioria deles são componentes comerciais e os usados para download são versões de teste; tempo ou Existem restrições de funcionalidade. Como o ASP pode chamar componentes OLE/COM padrão, podemos usar ferramentas de programação avançadas, como VB/VC/DELPHI, para personalizar nossos próprios componentes de upload de arquivo ASP de acordo com nossos próprios requisitos para atender aos nossos próprios requisitos de sistema de aplicativo.
A seguir discutiremos o princípio e o processo de implementação específico do uso do DELPHI para desenvolver componentes de upload de arquivos para ASP.
1. Princípio de implementação do upload de arquivos
O upload de dados baseado na Web deve estar em conformidade com o padrão RFC1867, e os dados do arquivo carregado não são exceção. Por exemplo, use o seguinte arquivo de página HTML (delphiup.htm) para selecionar o arquivo de upload:
<!-- DelphiUp.htm: Interface de upload de arquivo -->
<html><head><title>Upload de arquivo</title></head><body>
Implemente o upload de arquivos usando o componente de upload de arquivos escrito em DELPHI
<form NAME="UploadForm" ACTION="delphiup.asp" METHOD="POST" ENCTYPE="multipart/form-data">
<p>Salvar arquivo como: <input TYPE=text NAME="SaveAs">
<p>Selecione o arquivo para upload: <input TYPE=file NAME="FileData">
<input type="submit" name="b1" value="Confirmar upload"> </p>
</form>
</body></html>
Quando o cliente seleciona um arquivo (como Test.TXT, cujo conteúdo é "Aqui está o conteúdo de um arquivo para upload.") e pressione
Após o botão “Confirmar Upload” enviar os dados, os dados recebidos pelo programa do lado do servidor terão o seguinte formato:
--------------------------7cf1d6c47c#13#10
Disposição do conteúdo: dados do formulário name="Salvar como"#13#10#13#10;
NovoNomedoArquivo#13#10
--------------------------7cf1d6c47c#13#10
Disposição do conteúdo: form-data name="FileData";
Tipo de conteúdo: texto/simples#13#10#13#10
Aqui está o conteúdo de um arquivo para upload. #13#10
--------------------------7cf1d6c47c#13#10
Disposição do conteúdo: dados do formulário name="b1"#13#10#13#10;
Confirmar upload#13#10
--------------------------7cf1d6c47c--
Dentre eles, "--------------------------------7cf1d6c47c" é o delimitador utilizado para separar cada campo do formulário ( Forma);
#13#10 é a representação DELPHI de caracteres de retorno de carro e avanço de linha. Podemos pensar desta forma: a descrição das informações de cada campo do formulário começa com um delimitador mais um par de retornos de carro e feeds de linha #13#10; o nome de domínio do formulário começa com "name="" e termina com """; ; o campo do formulário O valor começa com dois pares de caracteres de retorno de carro e avanço de linha #13#10#13#10 e termina com um par de caracteres de retorno de carro e avanço de linha #13#10# mais um delimitador; começa com "filename="" e termina com """ no final. Com esses flags, podemos obter o nome e o valor do campo do formulário e o nome do arquivo a ser carregado, para que os dados do arquivo possam ser lidos e armazenados.
2. Processo de implementação de upload de arquivo
Depois de compreender o formato dos dados mencionado acima, não será mais difícil escrevermos nós mesmos um componente de upload de arquivo.
(1) Inicie um projeto para criar um componente ASP
Se você não estiver familiarizado com as etapas de uso do DELPHI para desenvolver o OLE Automation Server, consulte o artigo "Usando o DELPHI para desenvolver o OLE Automation Server para ASP" em "Electronics and Computers", edição 06, 1999.
Aqui apresentamos apenas brevemente as etapas.
1. Crie um projeto de biblioteca ActiveX
No DELPHI, selecione o menu Arquivo="Novo..., selecione "Biblioteca ActiveX" na guia ActiveX da caixa de diálogo "Novo Item" e o DELPHI criará automaticamente um projeto DLL PRoject1.
2. Crie componentes de automação
No DELPHI, selecione o menu File="New..., selecione "Automation Object" na guia ActiveX da caixa de diálogo "New Item"; em seguida, insira o nome da classe (como "UploadFile") no "Automation Object Wizard "caixa de diálogo, Instancing selecione" Múltiplos Instância". Após clicar em "OK", o DELPHI criará automaticamente um arquivo TLB (Type Library) Project1_TLB.PAS e um arquivo PAS (Unit) Unit1.PAS. Na janela de design da Type Library, renomeie Project1 para MyUpload, então o código de registro OLE do componente de upload de arquivo é "MyUpload.UploadFile".
3. Introduzir a biblioteca de tipos ASP
Para usar os cinco objetos integrados do ASP (Request, Response, Server, Application, Session), a biblioteca de tipos ASP precisa ser introduzida. Usamos principalmente o objeto Request para ler os dados passados do cliente para o servidor.
Selecione "Importar biblioteca de tipos" no menu Projeto e selecione "Biblioteca de objetos do Microsoft Active Server Pages (versão)" na lista "Bibliotecas de tipos" da caixa de diálogo "Importar biblioteca de tipos". 2.0)" (Se esta opção não estiver disponível, certifique-se de que IIS3 ou superior ou PWS4 ou superior esteja instalado em seu computador e que ASP.DLL tenha sido registrado corretamente), D ELPHI criará automaticamente um arquivo TLB ASPTypeLibrary_TLB.PAS, que contém a declaração de tipo de objeto ASP necessária.
4. Defina os processos OnStartPage e OnEndPage
Ao usar Server.CreateObject para criar uma instância de objeto OLE em uma página ASP, o servidor WEB chamará seu método OnStartPage e passará as informações do ambiente de aplicação ASP para o objeto. , podemos obter as informações do cliente durante esse processo; quando uma instância do objeto OLE for liberada na página ASP, o servidor WEB chamará seu método OnEndPage e poderemos realizar operações finais, como liberar memória durante esse processo. Em nosso componente, precisamos usar seu método OnStartPage.
O método OnStartPage deve ser definido em Unit1.PAS. O protótipo da função OnStartPage é:
procedimento OnStartPage(AScriptingContext: IUnknown);
O parâmetro AScriptingContext é uma variável do tipo IScriptingContext, incluindo cinco atributos (Request, Response, Server, Application, Session) correspondentes a cinco objetos internos de mesmo nome em ASP.
Precisamos adicionar o método OnStartPage a IUploadFile na janela de definição do TLB (View="Type Library), e sua instrução de declaração é "procedure OnStartPage(AScriptingContext: IUnknown);".
(2) Extrair dados carregados pelo cliente
Este trabalho pode ser feito no processo OnStartPage.
Utilizando a propriedade TotalBytes (comprimento do conteúdo das informações da solicitação) e o método BinaryRead na propriedade Request (tipo IRequest) do AScriptingContext, os dados das informações da solicitação carregados pelo cliente podem ser lidos em um array do tipo Byte e, em seguida, no formato de dados definido pelo RFC1867 padrão para analisar e extrair dados.
1. Primeiro defina várias variáveis privadas de TUploadFile
Adicione uma referência a ASPTypeLibrary_TLB.PAS (Uses) no arquivo de unidade UP01.PAS (salvo por Unit1.PAS),
então junte-se
privado
FContentLength: LongInt; //Solicita comprimento do conteúdo da informação
FContentData: Variant;//Dados de conteúdo, armazena o conteúdo das informações da solicitação na forma de um array
FFileName, //O nome do arquivo a ser carregado
FDelimeter: string; //Delimitador de campo do formulário
FScriptingContext: IScriptingContext;//ASP processa conteúdo de contexto
FFileDataStart, //Posição inicial dos dados do arquivo
FFileDataEnd: LongInt; //Posição final dos dados do arquivo
2. Extraia os dados de informações da solicitação carregados pelo cliente
//No evento OnStartPage, obtém as informações de contexto ASP, solicita o conteúdo das informações, os delimitadores dos campos do formulário e os dados do arquivo
procedimento TUploadFile.OnStartPage(AScriptingContext: IUnknown);
var
ARequest: IRequest; //objeto de solicitação WWW
AOleVariant: OleVariant; //Registra o comprimento do conteúdo das informações da solicitação
intDelimterLength: inteiro; //Comprimento do delimitador
longIndex,ALongInt,longPos : LongInt;
ContentData: AnsiString; // Representação em string do conteúdo das informações da solicitação
strTemp: string;
FindEndOfFileData: boolean; //Se a posição final dos dados do arquivo foi encontrada
começar
//Extraia os dados de informações da solicitação carregados pelo cliente
FScriptingContext := AScriptingContext as IScriptingContext;//Obter informações de contexto ASP
ARequest := FScriptingContext.Request;//Obter informações de solicitação WWW
FContentLength := ARequest.TotalBytes;//Comprimento do conteúdo da informação da solicitação
//Cria um array dinâmico para armazenar o conteúdo das informações da solicitação na forma de um array
FContentData := VarArrayCreate( [0,FContentLength], varByte );
// Armazena o conteúdo das informações da solicitação no array
AOleVariant := FContentLength;
FContentData := ARequest.BinaryRead(AOleVariant);//Lê o conteúdo das informações da solicitação
//Converte o conteúdo das informações da solicitação em uma string para facilitar o posicionamento
DadosConteúdo := ';
para longIndex := 0 a FContentLength - 1 faça
começar
ContentData: = ContentData + chr (Byte (FContentData [longIndex]));
if FContentData[ longIndex ] = 0 then break; //0 indica o fim do conteúdo
fim;
3. Obtenha o delimitador e carregue o nome do arquivo
//Obtém o delimitador do campo do formulário
longPos := pos( #13#10,ContentData );//A posição do caractere de retorno de carro e avanço de linha
FDelimeter := Copy( ContentData,1,longPos-1);//O conteúdo antes desta posição é o delimitador
//Obtém o nome do arquivo com o caminho de origem No conteúdo das informações da solicitação, o nome do arquivo começa com.
//Armazenamento no formato filename="path/filename"
strTemp := 'filename="';//O nome do arquivo vem depois de "filename=""
longPos := pos( strTemp, ContentData );//Obtém a posição "filename=""
se longPos <= 0 então
começar
NomedoArquivo := ';
FFileDataStart := -1;
FFileDataEnd := -2;
saída;
fim;
//Obtém o conteúdo antes das próximas aspas duplas """, ou seja, o nome do arquivo com o caminho de origem
longPos := longPos + comprimento(strTemp);
strTemp := ';
para longIndex := longPos para FContentLength - 1 faça
se ContentData[longIndex] <> '"'então
strTemp:= strTemp + ContentData[longIndex]
senão quebrar;
NomedoArquivo := strTemp;
4. Obtenha as posições inicial e final dos dados do arquivo no conteúdo das informações da solicitação
//A posição inicial dos dados do arquivo é após o primeiro #13#10#13#10 após o nome do arquivo
delete(ContentData, 1, longIndex);
strTemp := #13#10#13#10;
FFileDataStart := longIndex + pos(strTemp, ContentData) + comprimento(strTemp) - 1;
//A posição final dos dados do arquivo é antes do próximo #13#10 e do delimitador
//Como os dados do arquivo podem conter caracteres ilegais, a função de posicionamento de string POS não pode mais ser usada.
//Encontre a posição do próximo delimitador
FFileDataEnd := FFileDataStart;
intDelimterLength := comprimento( FDelimeter );
FindEndOfFileData := falso;
enquanto FFileDataEnd <= FContentLength - intDelimterLength do
começar
FindEndOfFileData := verdadeiro;
para ALongInt:= 0 para intDelimterLength - 1 faça
if Byte(FDelimeter[ALongInt + 1]) <>
FContentData[FFileDataEnd + ALongInt] então
começar
FindEndOfFileData := falso;
quebrar;
fim;
se FindEndOfFileData então quebrar;
FFileDataEnd := FFileDataEnd + 1;
fim;
se não for FindEndOfFileData então FFileDataEnd := FFileDataStart - 1//Nenhum delimitador encontrado
else FFileDataEnd := FFileDataEnd - 3;//Delimitador, pular para frente #13#10
fim;
(3) Transmitir informações para o programa ASP
Após realizar a operação (2), nosso componente de upload pode passar dados para o programa ASP de acordo com seus requisitos. Os dados atualmente disponíveis incluem: nome do arquivo de origem do cliente (FFileName, incluindo caminho), tamanho do arquivo (FFileDataEnd-FFileDataStart+1).
Primeiro, os dois métodos GetFileName e GetFileSize a seguir devem ser declarados na janela de design do TLB.
1. Retorne o nome do arquivo de origem do cliente (incluindo o caminho)
//Retorna o nome do arquivo de origem do cliente (incluindo o caminho)
função TUploadFile.GetFileName: OleVariant;
começar
resultado := FFileName;//Nome do arquivo de origem do cliente (incluindo caminho)
fim;
2. Retornar o tamanho do arquivo
//Retorna o tamanho do arquivo (Bytes)
função TUploadFile.GetFileSize: OleVariant;
começar
resultado: = FFileDataEnd - FFileDataStart + 1;
fim;
(4) Salvar arquivos
Após realizar a operação (2), nosso componente de upload pode salvar o arquivo de acordo com os requisitos do programa ASP. Primeiro deveria estar em
Os dois métodos a seguir, SaveFileAs e SaveFile, são declarados na janela de design do TLB.
1. Salve o arquivo de acordo com o nome de arquivo especificado
//Salve o arquivo de acordo com o nome de arquivo especificado O parâmetro FileName é o nome de arquivo especificado. O valor de retorno True indica que o arquivo foi salvo com sucesso.
função TUploadFile.SaveFileAs (Nome do arquivo: OleVariant): OleVariant;
var
índicelongo: LongInt;
AFile: arquivo de byte; //Salva o arquivo em formato binário
byteData: Byte;
começar
resultado := verdadeiro;
tentar
atribuir(AFile, FileName);
reescrever (Arquivo);
para longIndex := FFileDataStart para FFileDataEnd faça
começar
byteData: = Byte (FContentData[longIndex]);
Write(AFile, byteData);
fim;
CloseFile(AFile);
exceto
resultado := falso;
fim;
fim;
2. Salve o arquivo com o nome de arquivo padrão
//Salve o arquivo de acordo com o nome de arquivo padrão e salve o arquivo com o mesmo nome no diretório onde a página de chamada está localizada
função TUploadFile.SaveFile: OleVariant;
var
CurrentFilePath: string;
começar
//Obtém o diretório onde a página de chamada está localizada
CurrentFilePath := FScriptingContext.Request.ServerVariables['PATH_TRANSLATED'];
CurrentFilePath := ExtractFilePath( CurrentFilePath );
//salva o arquivo
resultado := SaveFileAs( CurrentFilePath + ExtractFileName( FFileName ));
fim;
3. Exemplos de aplicação de componentes de upload
Em nosso exemplo, DelphiUp.HTM é a interface de upload de arquivos e DelphiUp.ASP é usado para realizar operações de upload de arquivos.
O código do DelphiUp.ASP é o seguinte:
<!--DelphiUp.ASP: página de processamento de upload de arquivo-->
<html><head><title>Upload de arquivo</title></head><body>
<% dim Upload, Nome do arquivo
definir Upload = Server.CreateObject("MyUpload.UploadFile")
NomeArquivo = Upload.GetFileName
Response.Write "<br>Salvando arquivo ""&FileName&""..."
se Upload.SaveFile então
Response.Write "<br>O arquivo ""&FileName&"" foi carregado com sucesso."
Response.Write "<br>O tamanho do arquivo é "&Upload.GetFileSize&" bytes."
outro
Response.Write "<br>Arquivo ""&FileName&"" falhou ao carregar."
terminar se
definir Upload=nada %>
</body></html>
4. Algumas explicações
1. O tamanho do arquivo DLL compilado a partir do código-fonte gerado automaticamente pelo DELPHI é 215K, que pode ser encontrado em
Na seção Interface de ASPTypeLibrary_TLB.PAS, exclua todas as unidades em Usos, exceto ActiveX.
Ao excluir todas as unidades em Usos em MyUpload_TLB.PAS, o tamanho do arquivo DLL gerado pode ser reduzido para 61K.
2. O método acima também é aplicável a programas CGI, mas o objeto TWebRequest deve ser utilizado.
O programa acima foi depurado e passado em PWIN98+Delphi3.0+PWS4.0.