---
id: smallfiletransfer
title: 小文件传输
---

<a name="jyzSl"></a>

## 一、说明

小文件传输是指，当传输文件小于设定大小（默认1024*1024字节）时的传输。

为什么要设立小文件传输？与常规文件传输相比，优点在哪里？
常规传输，建立一个传输通道，大约需要传输两端，往返通信4-6次。这在本地局域网中，显得无所谓。但是在互联网环境中，一次ping延迟平均50ms，那么建立一个传输，就大约需要200-300ms。这也就意味着，即使一个文件只有一字节，也需要这些时间。所以，这明显是不合理的。所以TouchRpc又新增了小文件传输，只要文件在1Mb以内，仅往返1次，就可以完成传输。

当然，对于小文件的最高效传输方式依然是先压缩，后传输的方式。

<a name="m2KIr"></a>

## 二、使用

【拉取文件】

1. 直接调用PullSmallFile或者PullSmallFileAsync，获取到实际的文件数据。
2. 通过Save方法，将数据写入文件。也可以自行保存。

```csharp
var result = await this.fileClient.PullSmallFileAsync(path);//拉取文件
var saveResult = result.Save(savePath);//将拉取的数据进行保存。
```

【推送文件】

1. 直接调用PushSmallFile或者PushSmallFileAsync。
2. 返回值即表示是否成功。

```csharp
var result = await this.fileClient.PushSmallFileAsync(savePath, fileInfo);
if (result.IsSuccess())
{
}
```

> 其他可选参数可以自己定义。

<a name="WMSzi"></a>

## 三、客户端之间传输

该功能也支持客户端之间互相传输。使用方法基本一致，需要额外指定目标Id即可。

此外，**服务器**也需要同意路由

```csharp
internal class MyTouchRpcPlugin : TouchRpcPluginBase
{
    protected override void OnRouting(ITouchRpc client, PackageRouterEventArgs e)
    {
        if (e.RouterType== RouteType.PushFile||e.RouterType== RouteType.PullFile)
        {
            e.IsPermitOperation = true;
        }
        base.OnRouting(client, e);
    }
}
```

<a name="aFn83"></a>

##
