C# 之 FTP服务器中文件上传与下载(三)

通过上一篇博客《C# 之 FTP服务器中文件上传与下载(二)》,我们已经实现将文件上传到我们创建的FTP服务器。今天我们就一起来看看怎么样实现从FTP服务器中下载我们所需要的文件。

        我们想实现的效果是在页面上有一个超链接,超链接显示为我们想要下载的文件名。点击该文件名进入下载页面。首先我们在前台插入一个超链接,但是这个超链接为后台拼接的超链接。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class _Default : System.Web.UI.Page
{
    public static string strFileContent = "";
    protected void Page_Load(object sender, EventArgs e)
    {
        string strPath = "ftp://192.168.1.100:21/1.png";    //文件在ftp服务器中存放路径
        string strFileName = "1.png";   //文件名

        //拼接超链接
        strFileContent = "<a class=\"ke-insertfile\" href=\"/DownLoad.aspx?strPath=" + strPath + "&strFileName=" + strFileName + "\" target=\"_blank\">" + strFileName + "</a>";
    }
}
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <asp:FileUpload ID="fuImage" runat="server" Width="400px" />
    <asp:Button runat="server" ID="btnUpLoad" Text="上传" CssClass="nButton" OnClick="btnUpLoad_Click" />
    </div>
    <div>
    <%= strFileContent %>   <%--需要下载的文件名--%>
    </div>
    </form>
</body>
</html>

然后,我们新加入一个下载页面,此页面前台不需要任何东西

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="DownLoad.aspx.cs" Inherits="DownLoad" %>

<!DOCTYPE html>

<%--<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>

    </div>
    </form>
</body>
</html>--%>

编写最重要的后台下载代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class DownLoad : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        UpDownLoad();
    }

    /// <summary>
    /// 下载附件
    /// </summary>
    public void UpDownLoad()
    {

        string strPath = Request["strPath"].ToString(); //该文件在ftp服务器中的存放路径
        string strFileName = Request["strFileName"].ToString(); //文件名
        string strUserName = "hehe";    //ftp登录用户名
        string strPassword = "123456";  //ftp登录密码

        System.Net.WebClient request = new System.Net.WebClient();
        request.Credentials = new System.Net.NetworkCredential(strUserName, strPassword);//认证FTP用户名密码
        byte[] newFileData = request.DownloadData(strPath);

        //下载文件
        DownLoadFile(strFileName, newFileData, this.Page);

    }

    public static void DownLoadFile(string FileName, byte[] Context, Page page)
    {
        page.Response.ContentType = "application/octet-stream";
        if (FileName == "")
        {
            FileName = "Temp";
        }
        FileName = ToHexString(FileName);
        page.Response.AddHeader("Content-Disposition", "attachment;FileName=" + FileName);
        if (Context != null && Context.Length > 0)
            page.Response.OutputStream.Write(Context, 0, Context.Length);
        else
            page.Response.BinaryWrite(new byte[1]);
        page.Response.End();
    }

    public static string ToHexString(string s)
    {
        char[] chars = s.ToCharArray();
        StringBuilder builder = new StringBuilder();
        for (int index = 0; index < chars.Length; index++)
        {
            bool needToEncode = NeedToEncode(chars[index]);
            if (needToEncode)
            {
                string encodedString = ToHexString(chars[index]);
                builder.Append(encodedString);
            }
            else
            {
                builder.Append(chars[index]);
            }
        }

        return builder.ToString();
    }

    private static bool NeedToEncode(char chr)
    {
        string reservedChars = "$-_.+!*'(),@=&";

        if (chr > 127)
            return true;
        if (char.IsLetterOrDigit(chr) || reservedChars.IndexOf(chr) >= 0)
            return false;

        return true;
    }

    private static string ToHexString(char chr)
    {
        UTF8Encoding utf8 = new UTF8Encoding();
        byte[] encodedBytes = utf8.GetBytes(chr.ToString());
        StringBuilder builder = new StringBuilder();
        for (int index = 0; index < encodedBytes.Length; index++)
        {
            builder.AppendFormat("%{0}", Convert.ToString(encodedBytes[index], 16));
        }
        return builder.ToString();
    }
}

下面看看咱们的效果

点击超链接,下载文件

选择存放路径,点击下载

这样我们就将我们存放在ftp服务器中的文件下载到我们本地

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-12 15:56:00

C# 之 FTP服务器中文件上传与下载(三)的相关文章

C# 之 FTP服务器中文件上传与下载(四)

        通过上一篇博客<C# 之 FTP服务器中文件上传与下载(三)>,我们已经实现将文件从我们创建的FTP服务器中下载到本地.今天就最后给大家讲解一下怎么对FTP中的文件进行重命名和删除操作. 首先在前台添加两个重命名和删除的按钮 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Defaul

Http服务器实现文件上传与下载(四)

一.引言 欢迎大家来到和我一起编写Http服务器实现文件的上传和下载,现在我稍微回顾一下之前我说的,第一.二章说明说明了整体的HTTP走向,第三章实现底层的网络编程.接着这一章我想给大家讲的是请求获取,和响应发送的内容.这里主要讲解的响应内容,为什么?因为我们编写的是一个与浏览器交互的HTTP服务器,所以大多数的情况下我们只进行被动的应答. 这就是一种"提问--回答"的问题.其实在讲解这章的时候,我本来准备给大家讲解一下Linux一些信号中断的问题.因为在网络层发送的时候,系统会发送一

Http服务器实现文件上传与下载(一)

一.引言 大家都知道web编程的协议就是http协议,称为超文本传输协议.在J2EE中我们可以很快的实现一个Web工程,但在C++中就不是非常的迅速,原因无非就是底层的socket网络编写需要自己完成,上层的http协议需要我们自己完成,用户接口需要我们自己完成,如何高效和设计一个框架都是非常困难的一件事情.但这些事情Java已经在底层为我们封装好了,而我们仅仅只是在做业务层上的事情吧了. 在本Http服务器实现中,利用C++库和socket原套接字编程和pthread线程编写.拒绝使用第三方库

Http服务器实现文件上传与下载(五)

一.引言 欢迎大家和我一起编写Http服务器实现文件的上传和下载,现在我回顾一下在上一章节中提到的一些内容,之前我已经提到过文件的下载,在文件的下载中也提到了文件的续下载只需要在响应头中填写Content-Range这一字段,并且服务器的文件指针指向读取的指定位置开始读取传输.在这一章节中我讲讲解文件的上传这一功能,讲完这一章节,大致的功能也全部完成,接着就是上面文件控制模块和一些资源模块. 在文件的上传中主要以HttpRequest类为主,在考虑文件的上传时我一点迷惑,到底把文件的上传功能是放

extjs列表中文件上传与下载(带有重命名操作)

下面是extjs列表中文件上传与下载: 如图: 一.上传 上传按钮: { xtype: 'button', width: 60, margin: '0 20', text: ' 上 传 ', handler: 'onUploadClick' }] 上传按钮事件(打开上传窗口和传参): onUploadClick: function () { var me = this, view = me.getView(), vm = view.getViewModel(), store = me.getSt

java使用Jsch实现远程操作linux服务器进行文件上传、下载,删除和显示目录信息

1.java使用Jsch实现远程操作linux服务器进行文件上传.下载,删除和显示目录信息. 参考链接:https://www.cnblogs.com/longyg/archive/2012/06/25/2556576.html https://www.cnblogs.com/longyg/archive/2012/06/25/2561332.html https://www.cnblogs.com/qdwyg2013/p/5650764.html#top 引入jar包的maven依赖如下所示:

linux命令行模式下对FTP服务器进行文件上传下载

参考源:点击这里查看 1. 连接ftp服务器 格式:ftp [hostname| ip-address]a)在linux命令行下输入: ftp 192.168.1.1 b)服务器询问你用户名和密码,分别输入用户名和相应密码,待认证通过即可. 2. 下载文件 下载文件通常用get和mget这两条命令.a) get 格式:get [remote-file] [local-file]将文件从远端主机中传送至本地主机中.如要获取远程服务器上/usr/your/1.htm,则 ftp> get /usr/

PHPstorm设置连接FTP,进行文件上传、下载、比较

                                             内容转载自:http://www.cnblogs.com/jikey/p/3486621.html   如何在Webstorm/Phpstorm中设置连接FTP, 并快速进行文件比较,上传下载,同步等操作 补充: 1. 打开Remote Host窗口的方式: Tools | Deployment | Browse Remote Host 或 View | Tool Windows | Remote Host

Http服务器实现文件上传与下载(二)

一.引言 欢迎大家接着看我的博客,如何大家有什么想法的话回复我哦,闲话不多聊了,接着上一讲的内容来说吧,在上一节中已经讲到了请求头字符串的解析,并且在解析中我我们已经获取了url.就是上节中提到的/doing.当浏览器发送了/doing请求后,这是的与服务器的连接并没有中断,原因无他,就是浏览器等待接受服务端发来的信息,然后他对信息进行解析并显示在浏览器界面上.在编写Http服务器时的C/S结构时,我只编写服务端server,客户端直接用现成的浏览器即可. 当服务端找到浏览器需要的内容的时候,现