---
id: httpfiletransfer
sidebar_position: 5
title: 文件传输
sidebar_label: 9.5 文件传输
---

## 一、说明

该Http服务器及客户端，仅仅是轻量级的Http工具，不具备广泛的兼容性，所以请慎重使用。


## 二、服务器响应文件

该操作支持大型文件，也支持断点续传、支持迅雷加速等。

```csharp
internal class MyHttpPlug : HttpPluginBase
{
    protected override void OnGet(ITcpClientBase client, HttpContextEventArgs e)
    {
        if (e.Context.Request.UrlEquals("/file"))
        {
            e.Context.Response
                .SetStatus()//必须要有状态
                .FromFile(@"D:\System\Windows.iso", e.Context.Request);//直接回应文件。
        }
        base.OnGet(client, e);
    }
}

```

## 三、服务器接收上传文件

该操作目前仅支持小文件上传，实测100Mb没问题。

```csharp
internal class MyHttpPlug : HttpPluginBase
{
    protected override void OnPost(ITcpClientBase client, HttpContextEventArgs e)
    {
        if (e.Context.Request.UrlEquals("/uploadfile"))
        {
            try
            {
                if (e.Context.Request.ContentLen>1024*1024*100)//全部数据体超过100Mb则直接拒绝接收。
                {
                    e.Context.Response
                        .SetStatus("403", "数据过大")
                        .Answer();
                    return;
                }
                //此操作会先接收全部数据，然后再分割数据。
                //所以上传文件不宜过大，不然会内存溢出。
                var multifileCollection = e.Context.Request.GetMultifileCollection();

                foreach (var item in multifileCollection)
                {
                    StringBuilder stringBuilder = new StringBuilder();
                    stringBuilder.Append($"文件名={item.FileName}\t");
                    stringBuilder.Append($"数据长度={item.Length}");
                    client.Logger.Info(stringBuilder.ToString());
                }

                e.Context.Response
                        .SetStatus()
                        .FromText("Ok")
                        .Answer();
            }
            catch (Exception ex)
            {
                client.Logger.Exception(ex);
            }
        }
        base.OnPost(client, e);
    }
}

```
