Como carregar e transferir ficheiros a partir de um servidor remoto no ASP.NET

Aplica-se A
ASP.NET on .NET Framework 3.5 Service Pack 1

INTRODUÇÃO

Este artigo descreve um exemplo de arquitetura All-In-One que está disponível para transferência. Este exemplo de código demonstra como carregar e transferir ficheiros a partir de um servidor remoto ou local no ASP.NET. Pode transferir os pacotes de exemplo a partir dos seguintes ícones de transferência. Estão disponíveis versões de linguagem C# e Visual Basic .NET do pacote de exemplo.

Este exemplo de código demonstra como carregar e transferir ficheiros de um servidor que não está no âmbito do domínio de pedido do utilizador. A funcionalidade é fornecida para transferir ficheiros com os protocolos HTTP e FTP. Além disso, este exemplo de código utiliza Os Identificadores de Recursos Uniformes (URIs) para identificar as localizações dos ficheiros num servidor. As classes-chave utilizadas neste exemplo de código são a classe WebClient e a classe WebRequest.

Nível de dificuldade

            
            
             3c8ced02-816a-199c-e0fb-d2469da22246

Transferir informações

Para transferir este exemplo de código, clique numa das seguintes ligações:

Descrição geral técnica

É bastante fácil carregar e transferir ficheiros a partir de um servidor remoto no ASP.NET. A biblioteca de classes .NET Framework fornece alguns objetos de pedido simples. A classe WebClient é uma classe de alto nível que facilita as interações do servidor. Os objetos WebRequest são utilizados pela classe WebClient para fazer pedidos. As classes HttpWebRequest e FtpWebRequest são implementações específicas do protocolo da classe WebRequest abstrata. HttpWebRequest implementa os métodos GET e POST do protocolo HTTP para carregar e transferir ficheiros. FtpWebRequest implementa os métodos STOR e RETR do protocolo FTP para carregar e transferir ficheiros.

Este exemplo de código utiliza os métodos UploadData e DownloadData da classe WebClient para transferir dados de e para um URI de servidor remoto. O método UploadData é utilizado com o método PUT do protocolo HTTP e o tipo de suporte de dados da Internet "application/x-www-form-urlencoded". O método DownloadData é utilizado com um objeto FileStream para armazenar o fluxo de dados recebido e escrever a matriz de bytes num ficheiro local.

Descrição geral de exemplo

Neste código de exemplo, encontrará o ficheiro RemoteFileForm.aspx que explica como utilizar as duas novas classes seguintes:

  • RemoteUpload
  • RemoteDownload

A classe RemoteUpload

A classe RemoteUpload tem duas classes subordinadas. Estas classes são HttpRemoteUpload e FtpRemoteUpload. Ambas as classes utilizam o construtor RemoteUpload. A classe RemoteUpload requer uma matriz de bytes dos dados de ficheiro e um URI do servidor. Também pode especificar o nome a utilizar para o ficheiro carregado. A classe FtpRemoteUpload utiliza FtpWebRequest diretamente (em vez de utilizar a classe WebClient de nível superior) para processar os requisitos específicos do protocolo FTP.

Veja as seguintes definições de classe para obter mais informações sobre a classe RemoteUpload:
classe pública HttpRemoteUpload: RemoteUpload
    {
        public HttpRemoteUpload(byte[] fileData, string fileNamePath, string urlString)
            : base(fileData, fileNamePath, urlString)
        {

        }

        public override bool UploadFile()
        {
            byte[] postData;
            experimente
            {
                postData = isto. FileData;
                using (WebClient client = new WebClient())
                {
                    cliente. Credenciais = CredentialCache.DefaultCredentials;
                    cliente. Headers.Add("Content-Type", "application/x-www-form-urlencoded");
                    cliente. UploadData(isto. UrlString, "PUT", postData);
                }

                devolver verdadeiro;
            }
            catch (Exceção ex)
            {
                emitir nova Exceção("Falha ao carregar", por exemplo. InnerException);
            }

        }
    }

 ftpRemoteUpload da classe pública: RemoteUpload
    {
        public FtpRemoteUpload(byte[] fileData, string fileNamePath, string urlString)
            : base(fileData, fileNamePath, urlString)
        {

        }

        public override bool UploadFile()
        {
            FtpWebRequest reqFTP;
            reqFTP = (FtpWebRequest)FtpWebRequest.Create(isto. UrlString);
            reqFTP.KeepAlive = verdadeiro;
            reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
            reqFTP.UseBinary = true;
            reqFTP.ContentLength = isto. FileData.Length;

            int buffLength = 2048;
            byte[] buff = novo byte[buffLength];
            MemoryStream ms = novo MemoryStream(isto. FileData);

            experimente
            {
                int contenctLength;
                using (Stream strm = reqFTP.GetRequestStream())
                {
                    contenctLength = ms. Read(buff, 0, buffLength);
                    while (contenctLength > 0)
                    {
                        strm. Write(buff, 0, contenctLength);
                        contenctLength = ms. Read(buff, 0, buffLength);
                    }
                }

                devolver verdadeiro;
            }
            catch (Exceção ex)
            {
                emitir nova Exceção("Falha ao carregar", por exemplo. InnerException);
            }
        }

    } No ficheiro RemoteFileForm.cs, quando clica no botão Carregar , é criada uma instância do objeto RemoteUpload. Transmita o URI do servidor e um caminho de ficheiro físico local como parâmetros para criar o objeto.

Nota Se não especificar um nome de ficheiro a utilizar para armazenar o ficheiro no servidor, o sistema irá gerar automaticamente um nome de ficheiro de acordo com a data e hora atuais no servidor. A data e a hora são precisas para o milissegundo. Após a conclusão do método UploadData, o resultado é apresentado na página atual.

A classe RemoteDownload

A classe RemoteDownload também tem duas classes subordinadas. Estas classes são HttpRemoteDownload e FtpRemoteDownload. A classe RemoteDownload requer um recurso URI e um diretório físico local. A classe RemoteDownload verifica se o recurso URI existe antes de a transferência ser iniciada. A classe obtém o fluxo que contém os dados de resposta do servidor e, em seguida, escreve esta matriz de bytes num FileStream. A classe FtpRemoteDownload utiliza FtpWebRequest diretamente (em vez de utilizar a classe WebClient de nível superior) para processar os requisitos específicos do protocolo FTP.

Veja as seguintes definições de classe para obter mais informações sobre a classe RemoteDownload:
 classe pública HttpRemoteDownload: RemoteDownload
    {
        public HttpRemoteDownload(urlString de cadeia, string descFilePath)
            : base(urlString, descFilePath)
        {

        }

        substituição pública bool DownloadFile()
        {
            string fileName = System.IO.Path.GetFileName(isto. UrlString);
            string descFilePathAndName =
                System.IO.Path.Combine(isto. DescFilePath, fileName);
            experimente
            {
                WebRequest myre = WebRequest.Create(isto. UrlString);
            }
            abrangente
            {
                devolver falso;
            }
            experimente
            {
                byte[] fileData;
                using (WebClient client = new WebClient())
                {
                    fileData = cliente. DownloadData(isto. UrlString);
                }
                using (FileStream fs =
                      new FileStream(descFilePathAndName, FileMode.OpenOrCreate))
                {
                    fs. Write(fileData, 0, fileData.Length);
                }
                devolver verdadeiro;
            }
            catch (Exceção ex)
            {
                lançar nova Exceção("campo de transferência", por exemplo. InnerException);
            }
        }
    }

classe pública FtpRemoteDownload: RemoteDownload
    {
        public FtpRemoteDownload(urlString de cadeia, string descFilePath)
            : base(urlString, descFilePath)
        {

        }

        substituição pública bool DownloadFile()
        {
            FtpWebRequest reqFTP;

            string fileName = System.IO.Path.GetFileName(isto. UrlString);
            string descFilePathAndName =
                System.IO.Path.Combine(isto. DescFilePath, fileName);

            experimente
            {

                reqFTP = (FtpWebRequest)FtpWebRequest.Create(isto. UrlString);
                reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
                reqFTP.UseBinary = true;

                using (FileStream outputStream = new FileStream(descFilePathAndName, FileMode.OpenOrCreate))
                using (FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse())
                using (Stream ftpStream = response. GetResponseStream())
                {
                    int bufferSize = 2048;
                    int readCount;
                    byte[] buffer = new byte[bufferSize];
                    readCount = ftpStream.Read(buffer, 0, bufferSize);
                    while (readCount > 0)
                    {
                        outputStream.Write(buffer, 0, readCount);
                        readCount = ftpStream.Read(buffer, 0, bufferSize);
                    }
                }
                devolver verdadeiro;
            }

            catch (Exceção ex)
            {
                lançar nova Exceção("o carregamento falhou", por exemplo. InnerException);
            }
        }
    }
Nota Para obter mais informações sobre como criar e implementar a aplicação de exemplo, veja o ficheiro de Readme.txt incluído no pacote de transferência.

Idiomas

Este exemplo de código está disponível nas seguintes linguagens de programação:

Idioma Nome do Projeto
Visual C# CSRemoteUploadAndDownload
Visual Basic.NET VRemoteUploadAndDownload

Categoria de Tecnologia

  • ASP.NET 2.0
  • ASP.NET 3.5
  • ASP.NET 4.0

Referências

Para obter mais informações sobre a classe WebClient, visite o seguinte site do Microsoft Developer (MSDN):

Informações gerais sobre a classe WebClient Para obter mais informações sobre o método UploadData, visite o seguinte site da MSDN:

Informações gerais sobre o método UploadData Para obter mais informações sobre o método DonwloadData, visite o seguinte site da MSDN:

Informações gerais sobre o método DonwloadData Para obter mais informações sobre o método FtpWebRequest, visite o seguinte site da MSDN:

Informações gerais sobre o método FtpWebRequest Para obter mais informações sobre como carregar Files com FTP, visite o seguinte site da MSDN:

Como carregar Files com FTP

Mais Informações

O que é o All-In-One Code Framework?

O All-In-One Code Framework mostra a maioria das técnicas de desenvolvimento da Microsoft ao utilizar exemplos de código em diferentes linguagens de programação. Cada exemplo é cuidadosamente selecionado, composto e documentado para mostrar um cenário de código comum. Para obter mais informações sobre o All-In-One Code Framework, visite o seguinte site da Microsoft:

http://1code.codeplex.com

Como encontrar mais exemplos do All-In-One Code Framework

Para encontrar mais exemplos do All-In-One Code Framework, procure "kbcodefx" juntamente com palavras-chave relacionadas no Web site de suporte da Microsoft. Em alternativa, visite o seguinte site da Microsoft:

Exemplos do All-In-One Code Framework

Exclusão de responsabilidade de publicação rápida

A Microsoft Corporation e/ou os respetivos fornecedores não fazem qualquer representação sobre a adequação, fiabilidade ou precisão das informações e gráficos relacionados aqui contidos. Todas essas informações e gráficos relacionados são fornecidos "tal como estão" sem qualquer tipo de garantia. A Microsoft e/ou os respetivos fornecedores declinam, assim, todas as garantias e condições relativas a estas informações e gráficos relacionados, incluindo todas as garantias implícitas e condições de comercialização, adequação a um fim específico, esforço profissional, título e não infração. O Adquirente concorda especificamente que, em caso algum, a Microsoft e/ou os seus fornecedores serão responsáveis por quaisquer danos diretos, indiretos, punitivos, incidentais, especiais, consequentes ou quaisquer danos, incluindo, sem limitação, danos por perda de utilização, dados ou lucros, decorrentes de ou de qualquer forma ligados à utilização ou incapacidade de utilizar as informações e gráficos relacionados aqui contidos, com base no contrato, tortuoso, negligência, responsabilidade estrita ou não, mesmo que a Microsoft ou qualquer um dos seus fornecedores tenha sido avisado da possibilidade de danos.