v3.6.0 后：

* 内存与临时文件通过阀值自动切换。同时兼顾：小文件用内存，大文件用临时文件。

下面关于 "useTempfile" 的配置适用于 v3.6.0 之前


### 1、如果是高频且文件极小

使用“纯内存模式”，即默认。如果高频小文件，应该是不适合用“临时文件模式”的，磁盘可能容易刷坏。只能多配些内存！



### 2、如果是低频或者文件很大

建议使用“临时文件模式”。即上传的文件数据流，先缓存为临时文件，再以文件流形式提供使用。这个非常省内存。比如，上传 1GB 的文件，服务内存几乎不会上升。

* a) 添加配置

v2.7.2 后支持

```yaml
#设定上传使用临时文件（v2.7.2 后支持。v3.6.0 后失效，由 fileSizeThreshold 替代）
server.request.useTempfile: false #默认 false

#设定上传文件大小阀值（v3.6.0 后支持）
server.request.fileSizeThreshold: 512kb #默认 512kb
```



* b) 用后主动删除（建议，不管有没有用“临时文件模式”都主动删除。方便随时切换）

使用完后，注意要删掉（框架不会自动删除）。如不主动删除，可能会导致磁盘空间满，影响业务稳定性和可用性并可能导致数据丢失。

```java
@Controller
public class DemoController{
    @Post
    @Mapping("/upload")
    public void upload(UploadedFile file) { 
        try{
            //可以同步处理，也可以异步
            file.transferTo(new File("/demo/user/logo.jpg")); 
        } finally {
            //用完之后，删除"可能的"临时文件 //v2.7.2 后支持
            file.delete();
        }
    }
}   
```


关于临时文件的支持情况（所有适配的 solon-server 都支持）：


| 插件 | 情况 | 
| -------- | -------- | 
| solon-server-jdkhttp     | 支持     | 
| solon-server-smarthttp     | 支持     | 
| solon-server-grizzly	| 支持
| solon-server-jetty     | 支持     | 
| solon-server-jetty-jakarta     | 支持     | 
| solon-server-undertow     | 支持    | 
| solon-server-undertow-jakarta     | 支持    | 

* c) 使用过滤器实现自动删除（文件处理不能为异步，否则提前就删没了）

```java
public class FileDeleteFilter implements Filter {
    @Override
    public void doFilter(Context ctx, FilterChain chain) throws Throwable {
        chain.doFilter(ctx);
        
        if (ctx.isMultipartFormData()) {
            //批量删除临时文件
            for (List<UploadedFile> files : ctx.filesMap().values()) {
                for (UploadedFile file : files) {
                    file.delete();
                }
            }
        }
    }
}
```

v 2.7.3 后可以简化为：

```java
public class FileDeleteFilter implements Filter {
    @Override
    public void doFilter(Context ctx, FilterChain chain) throws Throwable {
        chain.doFilter(ctx);
        
        if (ctx.isMultipartFormData()) {
            ctx.filesDelete(); //v2.7.3 后支持
        }
    }
}
```

