c# - 上传到ftp C#时文件名中的西里尔字母
问题描述
我正在编写一个将文件上传到远程 ftp 服务器的程序。但是,下载的文件有时包含西里尔字母。文件内容正确加载,但名称失真。我知道这是由于编码。我尝试使用Encoding.GetEncoding(1251).GetString(Encoding.GetEncoding(1251).GetBytes(file.FileName))
和其他编码。没有帮助。同时,存储在同一个 ftp 上的 php 脚本可以正确上传带有西里尔字母的文件。
public void FtpUpload(IFormFile file, string filePath)
{
FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://xxx.xxx.xx.xxx/" + filePath);
request.Method = WebRequestMethods.Ftp.UploadFile;
request.Credentials = new NetworkCredential("username", "pass");
byte[] fileBytes;
if (file.Length > 0)
{
using (var ms = new MemoryStream())
{
file.CopyTo(ms);
fileBytes = ms.ToArray();
}
}
else return;
request.ContentLength = fileBytes.Length;
using (Stream request_stream = request.GetRequestStream())
{
request_stream.Write(fileBytes, 0, fileBytes.Length);
request_stream.Close();
}
}
filePath = "Тест.pdf"
我尝试使用 HttpUtility.UrlEncode(filePath)
. 没有什么帮助。请告诉我,如何处理?
解决方案
找到解决方案。在浏览了更多论坛后,我遇到了以下解决方案:
通过NuGet Package Management
安装包System.Net.FtpClient
。然后我们编写如下代码:
public void FtpClientUpload(IFormFile file, string filePath)
{
FtpClient ftp = new FtpClient();
ftp.Host = "xxx.xxx.xx.xxx";
ftp.Credentials = new NetworkCredential("username", "pass");
ftp.Encoding = Encoding.GetEncoding(1251);
using (var remote = ftp.OpenWrite( filePath, FtpDataType.Binary))
file.CopyTo(remote);
}
推荐阅读
- python - 如何将 Excel 列读取为 datetime.datetime 而不是自动 datetime.time
- boost-bimap - boost::bimap::unordered_set_of v/s std::unordered_set 的优势
- reactjs - 仅更新字符串数组时如何进行状态更新
- java - 将大字符串写入文件的问题
- git - 在进行分支合并时,我应该怎么做才能避免丢失与 Git 的提交?
- ruby - 尝试使用 Ruby 对我的数据湖存储 gen2 进行 Azure REST API 调用时,“服务器无法对请求进行身份验证”
- vue.js - 预加载器vue.js的工作问题
- android - 在android中调用公共类
- macos - 如何修复 osx 上 gitlab-runner exec docker 的“作业失败:无效的卷规范”
- angular - 如何从 JSON 字符串创建一个垫角表?