You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C# & ASP.NET MVC中扩展SFTP上传函数实现文件重命名

解决SFTP上传重命名无效的问题

先排查URLDetails的序列化问题

检查URLDetails类的FileName属性是否正确配置序列化规则:

  • 若使用System.Text.Json,确保属性是公共可读写的,未被[JsonIgnore]标记;如果后端接口接收的字段名和属性名不一致,需添加[JsonPropertyName("fileName")](括号内为后端实际接收的字段名)。
  • 若使用Newtonsoft.Json,对应添加[JsonProperty("fileName")]特性。

示例(System.Text.Json场景):

public class URLDetails
{
    [JsonPropertyName("fileName")]
    public string FileName { get; set; }
    // 其他属性...
}

检查后端接口是否处理FileName参数

你的重载逻辑只是给URLDetails赋值了FileName,但如果接收上传的后端API未读取该参数,仍直接从文件流中获取原始文件名,那设置操作不会生效。

需要确认Routes.UploadsEndpoints.UploadFiles对应的后端逻辑:

  • 后端是否从请求的JSON体中读取FileName?
  • 后端执行SFTP上传时,是否用这个传入的FileName作为远程文件名称,而非上传文件的原始名称?

如果后端未处理该参数,需修改后端代码让其优先使用传入的文件名;若后端不支持该参数,此重载方案则不可行,需更换实现方式。

排查URLDetails是否为不可变类型

如果URLDetails是record类型,或FileName属性为只读(仅含get无set),直接赋值urlDetails.FileName = fileName不会生效——因为record是不可变类型,赋值操作会创建新实例但未被传入请求。

这种情况需创建新的URLDetails实例:

public async Task<IResult<string>> UploadFileAsync(URLDetails urlDetails, string fileName)
{
    // record类型用with表达式创建新实例
    var updatedDetails = urlDetails with { FileName = fileName };
    // 普通只读属性类,通过构造函数创建新实例
    // var updatedDetails = new URLDetails(urlDetails) { FileName = fileName };
    var response = await _httpClient.PostAsJsonAsync(Routes.UploadsEndpoints.UploadFiles, updatedDetails);
    return await response.ToResult<string>();
}

确认是否存在优先级更高的文件名来源

部分上传逻辑中,后端会优先从MultipartFormData的文件项中获取文件名,而非JSON体参数。如果你的上传逻辑混合了文件流与JSON参数,需确保后端优先使用你传入的FileName。

若属于这种场景,可改用MultipartFormDataContent上传,将自定义文件名作为表单字段传递:

public async Task<IResult<string>> UploadFileAsync(URLDetails urlDetails, string fileName)
{
    using var content = new MultipartFormDataContent();
    // 添加URLDetails的其他属性
    content.Add(new StringContent(urlDetails.SomeProperty), "someProperty");
    // 传递自定义文件名
    content.Add(new StringContent(fileName), "fileName");
    // 添加文件流(假设urlDetails包含文件流属性)
    content.Add(new StreamContent(urlDetails.FileStream), "file", fileName);

    var response = await _httpClient.PostAsync(Routes.UploadsEndpoints.UploadFiles, content);
    return await response.ToResult<string>();
}

此方案需后端接口同步改为接收MultipartFormData格式的请求。

调试确认请求内容

可通过打印请求序列化后的JSON内容,确认FileName是否正确传入:

var json = JsonSerializer.Serialize(urlDetails);
Console.WriteLine(json); // 查看输出是否包含fileName字段及对应值

若JSON中无FileName,则是序列化问题;若有,则肯定是后端未处理该参数。

内容的提问来源于stack exchange,提问作者asmgx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 09:46:19