如何在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
相关产品推荐
相关产品推荐

