Como carregar um arquivo em um servidor Web no ASP.NET usando o Visual C# .NET


Resumo


Este artigo passo a passo descreve como carregar um arquivo em um servidor Web usando o Visual C# .NET. Neste artigo, você cria um arquivo Microsoft ASP.NET (WebForm1) e o arquivo de code-behind relacionados (WebForm1) para carregar arquivos em um diretório chamado dados. voltar ao início

Criar um aplicativo ASP.NET

No Microsoft Visual Studio .NET, siga estas etapas para criar um novo aplicativo para carregar arquivos para o servidor Web:
  1. Inicie o Microsoft Visual Studio .NET.
  2. No menu Arquivo, aponte para Novo e, em seguida, clique em Projeto.
  3. Na caixa de diálogo New Project , clique em Visual C# Projects em Project Typese, em seguida, clique em ASP.NET Web Application em modelos.
  4. Na caixa Location , digite a URL para criar o projeto. Para este exemplo, digitehttp://localhost/CSharpUpload, que cria o nome do projeto padrão de CSharpUpload. Observe que o arquivo WebForm1 é carregado no modo de exibição Designer do Visual Studio .NET.
voltar ao início

Criar o diretório de dados

Depois de criar o aplicativo, você pode criar o diretório de dados que aceitará arquivos carregados. Depois de criar essa pasta, você também deve definir permissões para a conta ASPNET do operador de gravação.
  1. Na janela Gerenciador de Soluções do Visual Studio .NET, clique com o botão direito do mouse em CSharpUpload, aponte para Adicionar e, em seguida, clique em Nova pasta. Por padrão, é criada uma nova pasta chamada NewFolder1.
  2. Para alterar o nome da pasta de dados, clique com o botão NewFolder1, clique em Renomeare digite dados.
  3. Inicie o Windows Explorer e localize a pasta de sistema de arquivo de dados que você criou na etapa 2. Por padrão, essa pasta está localizada na seguinte pasta:
    C:\Inetpub\wwwroot\CSharpUpload\Data
  4. Para alterar as configurações de segurança para conceder permissões de escrita para o diretório de dados, clique em Dados e, em seguida, clique em Propriedades.
  5. Na caixa de diálogo Propriedades de dados , clique na guia segurança e, em seguida, clique em Adicionar.
  6. Na caixa de diálogo Selecionar usuários ou grupos , clique na conta ASPNET e, em seguida, clique em Adicionar. Clique Okey para fechar a caixa de diálogo Selecionar usuários ou grupos .
  7. Clique o conta aspnet_wp (NomeDoComputador\ASPNET) da conta e, em seguida, clique para selecionar as caixas de seleção Permitir as seguintes permissões:
    • Ler e executar
    • Listar conteúdo de pastas
    • Leitura
    • Gravação
    Desmarque outras caixas de seleção Permitir e Negar .
  8. Clique Okey para fechar a caixa de diálogo Propriedades de dados . Você modificou as permissões do diretório de dados para aceitar arquivos do usuário carregado com êxito.
voltar ao início

Modifique a página WebForm1

Para modificar o código HTML do arquivo WebForm1 para permitir que os usuários carreguem arquivos, siga estas etapas:
  1. Retornar a instância aberta do Visual Studio .NET. WebForm1 deve estar aberto na janela do Designer.
  2. Para exibir o código fonte HTML da página WebForm1, clique com botão direito WebForm1 na janela de Designer e, em seguida, clique em Exibir código-fonte HTML.
  3. Localize o seguinte código HTML que contém a marca < form >:
    <form id="Form1" method="post" runat="server">
  4. Adicionar o enctype = "multipart/form-data" atributo de nome-valor a tag < form > como segue:
    <form id="Form1" method="post" enctype="multipart/form-data" runat="server">
  5. Depois da tag de abertura < formulário >, adicione o seguinte código:
    <INPUT type=file id=File1 name=File1 runat="server" /><br><input type="submit" id="Submit1" value="Upload" runat="server" />
  6. Verifique se a marca HTML < form > aparece da seguinte maneira:
    <form id="Form1" method="post" enctype="multipart/form-data" runat="server"><INPUT type=file id=File1 name=File1 runat="server" /><br><input type="submit" id="Submit1" value="Upload" runat="server" /></form>
voltar ao início

Adicione o código de carregamento de arquivo code-behind WebForm1

Para modificar o arquivo de code-behind WebForm1 para que ele aceite os dados carregados, siga estas etapas:
  1. No menu Exibir , clique em Design.
  2. Clique duas vezes em carregar. Visual Studio abre o arquivo de code-behind WebForm1 e gera automaticamente o código de método a seguir:
    private void Submit1_ServerClick(object sender, System.EventArgs e){}
  3. Verifique se o código a seguir existe no nível de classe do arquivo WebForm1.cs:
    protected System.Web.UI.HtmlControls.HtmlInputFile File1;protected System.Web.UI.HtmlControls.HtmlInputButton Submit1;
    Se esse código não existir no arquivo, adicione o código no arquivo após a seguinte linha:
    public class WebForm1 : System.Web.UI.Page{
  4. Localize o código a seguir:
    private void Submit1_ServerClick(object sender, System.EventArgs e){
  5. Pressione ENTER para adicionar uma linha em branco e, em seguida, adicione o seguinte código:
    if( ( File1.PostedFile != null ) && ( File1.PostedFile.ContentLength > 0 ) ){string fn = System.IO.Path.GetFileName(File1.PostedFile.FileName);string SaveLocation = Server.MapPath("Data") + "\\" +  fn;try{File1.PostedFile.SaveAs(SaveLocation);Response.Write("The file has been uploaded.");}catch ( Exception ex ){Response.Write("Error: " + ex.Message);//Note: Exception.Message returns a detailed message that describes the current exception. //For security reasons, we do not recommend that you return Exception.Message to end users in //production environments. It would be better to put a generic error message. }}else{Response.Write("Please select a file to upload.");}
    Este código primeiro verifica que um arquivo foi carregado. Se nenhum arquivo foi selecionado, você recebe a mensagem "Selecione um arquivo para carregar". Se um arquivo é carregado, seu nome de arquivo é extraído por meio do namespace System.IO e seu destino é montado em um caminho de Salvar como . Depois que o destino final é conhecido, o arquivo será salvo usando o método File1.PostedFile.SaveAs . Nenhuma exceção é interceptada e a mensagem de exceção é exibida na tela.
  6. Verifique se a sub-rotina Submit1 aparece da seguinte maneira:
    private void Submit1_ServerClick(object sender, System.EventArgs e){if( ( File1.PostedFile != null ) && ( File1.PostedFile.ContentLength > 0 ) ){string fn = System.IO.Path.GetFileName(File1.PostedFile.FileName);string SaveLocation = Server.MapPath("Data") + "\\" +  fn;try{File1.PostedFile.SaveAs(SaveLocation);Response.Write("The file has been uploaded.");}catch ( Exception ex ){Response.Write("Error: " + ex.Message);//Note: Exception.Message returns detailed message that describes the current exception. //For security reasons, we do not recommend you return Exception.Message to end users in //production environments. It would be better just to put a generic error message. }}else{Response.Write("Please select a file to upload.");}}
voltar ao início

Testar o aplicativo

Para criar uma solução Visual Studio .NET e testar o aplicativo, siga estas etapas:
  1. No menu Compilar, clique em Compilar Solução.
  2. No Solution Explorer, clique com botão direito WebForm1e, em seguida, clique em View in Browser.
  3. Depois de WebForm1 é aberta no navegador, clique em Procurar.
  4. Na caixa de diálogo Escolher arquivo , selecione um arquivo que é menor do que 4 megabytes (MB) e, em seguida, clique em Abrir.
  5. Para carregar o arquivo, clique em carregar. Observe que o arquivo carrega no servidor Web e você recebe a mensagem "o arquivo foi carregado".
  6. Retornar à instância aberta do Windows Explorer e localize o diretório de dados.
  7. Verifique se que o arquivo foi carregado para o diretório de dados.
voltar ao início

Carregar arquivos maiores

Por padrão, o ASP.NET permite apenas arquivos que estão 4.096 kilobytes (KB) (ou 4 MB) ou menos para ser carregado no servidor Web. Para carregar arquivos maiores, você deve alterar o parâmetro maxRequestLength da seção < httpRuntime > no arquivo Web. config. Observação: Quando o atributo maxRequestLength está definido no arquivo Machine. config e, em seguida, uma solicitação é lançada (por exemplo, um upload de arquivo) que excede o valor maxRequestLength, uma página de erro personalizada não pode ser exibida. Em vez disso, o Microsoft Internet Explorer exibirá uma mensagem de erro "Servidor não encontrado ou DNS". Se você quiser alterar essa configuração para todo o computador e não apenas o aplicativo ASP.NET, você deve modificar o arquivo Machine. config. Por padrão, o elemento < httpRuntime > é definido para os seguintes parâmetros no arquivo Machine. config:
<httpRuntime executionTimeout="90" maxRequestLength="4096"useFullyQualifiedRedirectUrl="false" minFreeThreads="8" minLocalRequestFreeThreads="4"appRequestQueueLimit="100"/>
O arquivo Machine. config está localizado no \ diretórioRaiz do sistema\CONFIGNúmero de versãodo \Microsoft.NET\Framework\. voltar ao início

Lista completa de códigos

WebForm1.aspx

<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="CSharpUpload.WebForm1" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" ><HTML>  <HEAD>    <title>WebForm1</title>    <meta name="GENERATOR" Content="Microsoft Visual Studio 7.0">    <meta name="CODE_LANGUAGE" Content="C#">    <meta name=vs_defaultClientScript content="JavaScript">    <meta name=vs_targetSchema content="http://schemas.microsoft.com/intellisense/ie5">  </HEAD>  <body MS_POSITIONING="GridLayout"><form id="Form1" method="post" enctype="multipart/form-data" runat="server"><INPUT type=file id=File1 name=File1 runat="server" ><br><input type="submit" id="Submit1" value="Upload" runat="server" NAME="Submit1"></form>  </body></HTML>
voltar ao início

WebForm1.aspx.cs

using System;using System.Collections;using System.ComponentModel;using System.Data;using System.Drawing;using System.Web;using System.Web.SessionState;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.HtmlControls;namespace CSharpUpload{/// <summary>/// Summary description for WebForm1./// </summary>public class WebForm1 : System.Web.UI.Page{protected System.Web.UI.HtmlControls.HtmlInputFile File1;protected System.Web.UI.HtmlControls.HtmlInputButton Submit1;private void Page_Load(object sender, System.EventArgs e){// Put user code to initialize the page here}#region Web Form Designer generated codeoverride protected void OnInit(EventArgs e){// // CODEGEN: This call is required by the ASP.NET Web Form Designer.// InitializeComponent();base.OnInit(e);}/// <summary>/// Required method for Designer support - do not modify/// the contents of this method with the code editor./// </summary>private void InitializeComponent(){    this.Submit1.ServerClick += new System.EventHandler(this.Submit1_ServerClick);this.Load += new System.EventHandler(this.Page_Load);}#endregionprivate void Submit1_ServerClick(object sender, System.EventArgs e){if( ( File1.PostedFile != null ) && ( File1.PostedFile.ContentLength > 0 ) ){string fn = System.IO.Path.GetFileName(File1.PostedFile.FileName);string SaveLocation = Server.MapPath("Data") + "\\" +  fn;try{File1.PostedFile.SaveAs(SaveLocation);Response.Write("The file has been uploaded.");}catch ( Exception ex ){Response.Write("Error: " + ex.Message);//Note: Exception.Message returns a detailed message that describes the current exception. //For security reasons, we do not recommend that you return Exception.Message to end users in //production environments. It would be better to return a generic error message. }}else{Response.Write("Please select a file to upload.");}}}}
voltar ao início

Informações adicionais


Teoricamente, o tamanho de carregamento máximo do arquivo é muito grande. No entanto, por causa de monitoramento da integridade ASP.NET, não é possível carregar arquivos muito grandes no ASP.NET. O processo do operador ASP.NET tem um espaço de endereço virtual de 2 gigabytes (GB). No entanto, o processo do operador ASP.NET usa apenas um pouco mais de 1 GB por causa de fragmentação de memória e monitoramento de integridade. Durante o processo de carregamento, o ASP.NET carrega o arquivo inteiro na memória antes que o usuário pode salvar o arquivo no disco. Portanto, o processo pode reciclar devido o atributo memoryLimit da marca processModel do arquivo Machine. config. O atributo memoryLimit Especifica a porcentagem de memória física que o processo do operador do ASP.NET pode esgotar antes do processo é reciclado automaticamente. Reciclagem impede que vazamentos de memória fazendo com que o ASP.NET falhe ou pare de responder. Além disso, outros fatores desempenham um papel no tamanho máximo de arquivo que pode ser carregado. Esses fatores incluem a memória disponível, espaço disponível em disco rígido, velocidade do processador e tráfego de rede atual. Com o tráfego regular dos arquivos sendo carregados, a Microsoft recomenda que você use um tamanho de arquivo máximo no intervalo de 10 a 20 megabytes (MB). Se você raramente carregar arquivos, o tamanho máximo pode ser 100 MB. Observação: Você pode carregar arquivos maiores que 100 MB no ASP.NET. No entanto, a Microsoft recomenda que você siga os tamanhos de carregamento máximo de arquivo que são mencionados neste artigo. Para determinar os tamanhos de arquivo mais precisos, execute estresse teste em computadores que são semelhantes àquelas que será usado na produção. Se você encontrar os limites de tamanho de arquivo durante o processo de carregamento de arquivo, você pode observar as seguintes mensagens de erro:
  • A página não pode ser exibida.
  • Aplicativo do servidor não está disponível
    No log de eventos, a mensagem de erro será semelhante à seguinte:
  • Exceção do tipo System. OutOfMemoryException foi lançada.
Você também pode encontrar que carregamentos ocorrerem muito lentamente. Se você observar o processo de Aspnet_wp.exe no Gerenciador de tarefas do Windows, você irá notar que o delta memória muda por 64 KB cada 1 a 2 segundos. Dependendo do tamanho do arquivo, esse atraso pode fazer com que o processo do operador ASP.NET reciclar devido a um erro responseDeadlock.

Referências


Para obter informações adicionais, visite os seguintes sites da Web Microsoft Developer Network (MSDN);voltar ao início