遭遇する問題は、複数の異なるサーバー間でファイルの保存とアクセスを実現する方法です。これらのファイルにはある程度の機密性があり、対応するストレージ サーバー B に保存され、システムは別のサーバー A にあります。その方法ファイルのストレージとオンライン プレビューは?
解決策:外部アクセス用にストレージ サーバー上に FTP サイトを作成します。プレビューでは、プレビュー ページにコールバックするためにストレージ サーバー上に別のサイトも開きます。
1. ftp の概要
FTP は英語の File Transfer Protocol (File Transfer Protocol) の略称で、中国語の略称は「Text Protocol」です。インターネット上で制御ファイルを双方向に送信するために使用されます。同時にアプリケーション(Application)でもあります。さまざまなオペレーティング システムに基づいたさまざまな FTP アプリケーションがあり、これらのアプリケーションはすべて同じプロトコルに従ってファイルを転送します。FTP を使用する際、ユーザーは「ダウンロード」 (ダウンロード) と「アップロード」 (アップロード) という 2 つの概念に遭遇することがよくあります。ファイルの「ダウンロード」とは、リモート ホストから自分のコンピュータにファイルをコピーすることを意味し、ファイルの「アップロード」とは、自分のコンピュータからリモート ホストにファイルをコピーすることを意味します。インターネット言語では、ユーザーはクライアント プログラムを通じてリモート ホストにファイルをアップロード (ダウンロード) できます。
まず、リモート FTP サーバー サイトを確立する必要があります。
リモート FTP サーバーを構築する方法:
参考:
Windows Server 2016 の FTP サーバーの構築と展開 - AdairHpn - Blog Garden (cnblogs.com)
注: バックエンドの FTP サーバーにログインするために使用されるドキュメント アクセスの読み取りおよび書き込み権限を設定するには、FTP ユーザーを作成する必要があります。
テストローカルで FTP サイトにアクセスできますか? 考えられる問題は、ファイアウォールがサイト ポート 21 を開いていないことです。ファイアウォールでポートを開く必要があります。
ローカル アクセスが利用できないもう 1 つの理由は次のとおりです。
チェックマークを外し、FTP アクティブ アクセス方法を使用して再度テストすると、リモート FTP サービスにローカルでアクセスできるようになります。
FTPサーバーのポートが開いている必要があります。
使用方法は次のとおりです。
FluentFTP ( Class FtpClient Download · robinrodricks/FluentFTP Wiki (github.com) ) プラグインは FTP サーバー上で動作します。
参考: FluentFTP、.NET Core での使いやすい FTP フレームワーク_rizon886 のブログ - CSDN ブログ
プロジェクトでは、他のスペースやサーバーにファイルを一括でアップロードすることがよくありますが、その際には FTP プロトコルを使用して送信する必要がある場合があるため、ここでは非常に便利な FTP 送信フレームワークである FluentFTP の使用を推奨します。
参考記事内の実装のコード説明は次のとおりである必要があります。
1. FTPサーバーにログインします。
2. 接続を開きます
3. 操作 (アップロードまたはダウンロードなど) には、参考記事に記載されている文字列型変換の問題が散りばめられています。
4. 接続を閉じます
文字列操作の質問:
ftpClient.Execute("OPTS UTF8 ON");
ファイルをアップロードおよびダウンロードするには、公式 Web サイト (ホーム · robinrodricks/FluentFTP Wiki (github.com) ) を使用して、IO ストリームまたはバイトによってアップロードまたはダウンロードするインターフェイス ドキュメントを提供します。
ここではフローメソッドを使用しており、以下に特定のコードを貼り付けます: (asp.net core)
#region FTP操作服务
/// <summary>
/// 单文件上传到ftp服务器
/// </summary>
/// <param name="file">文件流</param>
/// <param name="RomotePath">ftp远程地址</param>
/// <param name="address">服务器地址</param>
/// <param name="userName">用户名</param>
/// <param name="passWord">密码</param>
/// <param name="port">端口</param>
/// <returns></returns>
public async Task FtpUpload(IFormFile file, string RomotePath, string address, string userName, string passWord, int port)
{
bool isok = false;
//上传文件
using (AsyncFtpClient ftpClient = new AsyncFtpClient($"ftp://{address}", userName, passWord, port, config: new FtpConfig
{
DataConnectionType = FtpDataConnectionType.PORT //主动ftp连接方式
}))
{
if (!ftpClient.IsConnected)
{
await ftpClient.Connect();
//上传文件
try
{
using (var fs = file.OpenReadStream())
{
FtpStatus status =await ftpClient.UploadStream(fs, RomotePath, FtpRemoteExists.Overwrite,true);//同名覆盖 创建文件夹
isok = status == FtpStatus.Success;
if (isok) isok = true;
}
await ftpClient.Disconnect();
ftpClient.Dispose();//关闭服务 释放连接
}
catch (System.Exception)
{
await ftpClient.Disconnect();
ftpClient.Dispose(); //关闭服务 释放连接
throw Oops.Oh("FTP文件上传出现错误!");
}
}
}
if (!isok)
{
Oops.Oh("FTP文件上传异常");
}
}
/// <summary>
/// 字节方式 下载FTP文件
/// </summary>
/// <param name="filename">返回文件名</param>
/// <param name="filePaths">文件在服务器路径</param>
/// <param name="filesize">现有文件的大小(以字节为单位),如果未知,则为 0</param>
/// <param name="address">服务器ip</param>
/// <param name="userName">用户名</param>
/// <param name="passWord">密码</param>
/// <param name="port">端口</param>
/// <returns></returns>
public async Task<FileStreamResult> FtpDownload(string filename,string filePaths,int filesize, string address, string userName, string passWord,int port) {
byte[] outBuffsinfo = new byte[] { };
using (AsyncFtpClient ftpClient = new AsyncFtpClient($"ftp://{address}", userName, passWord, port, config: new FtpConfig
{
DataConnectionType = FtpDataConnectionType.PORT //主动ftp连接方式
}))
{
if (!ftpClient.IsConnected)
{
await ftpClient.Connect();
outBuffsinfo = await ftpClient.DownloadBytes(filePaths, filesize);
await ftpClient.Disconnect();
ftpClient.Dispose();//关闭服务 释放连接
}
}
var fileName = HttpUtility.UrlEncode(filename, Encoding.GetEncoding("UTF-8"));
MemoryStream streams = new MemoryStream(outBuffsinfo);
FileStreamResult result = new FileStreamResult(streams, "application/octet-stream") { FileDownloadName = fileName };
return result;
}
#endregion
上記のメソッドを呼び出すだけで、ページを通常どおりアップロードまたはダウンロードできます。
プレビュー操作リモートサーバー:
FTP サーバー上のサイトを開き、ドキュメント ディレクトリを見つけてプレビュー サーバーのポートを開き、アクセスするときに対応するストレージ アドレスを直接入力します (例: http://111.2.3.4:2256/doc/2023/05/)。 26/123456 .pdf
このようにして、対応するファイルのプレビューにアクセスできます。
FTP 設定リファレンス完全版について:
(メッセージ 70 件) Windows での FTP 構築_windows ftp_&Tannianhua& のブログ-CSDN ブログ
(メッセージ 70 件) FTP サーバーがファイアウォール関連を開くconfiguration_weixin_34210740 のブログ-CSDN ブログ
問題が発生します:
1、C#でバイト配列をオブジェクトストリームに変換するにはどうすればよいですか?
参考: C# でバイト配列をオブジェクト ストリームに変換するには? - 体験記
MemoryStream stream = new MemoryStream(byteArray);
2. FTP サーバーにアクセスするためのアクティブな方法として設定する必要があります: (上記の完全なコードにはこの段落があります) 次の接続が必要であることに気づきませんでした: await ftpClient.Connect(); の代わりに自動接続。
参考: (メッセージ数 70) firewall_iteye_11700 のブログが原因で FTP が使用できなくなる場合の解決策 - CSDN ブログ
DataConnectionType = FtpDataConnectionType.PORT //主动ftp连接方式
3. ポートの問題 (ファイアウォール) によりアクセス不能の問題が発生します:
方法 1: Windows ファイアウォールによる FTP インターセプトを解決する方法 - Baidu Experience (baidu.com)
方法 2: (メッセージ 70) Windows で FTP を構築する
方法 3: 私自身もこの解決策を参考にしました:ウィンドウ サーバー オペレーティング システムでファイアウォールをオンにすると FTP が使用できない問題の解決策について - Jian Yi Blog
システム サーバー上で受信ルールが設定され、プログラムへのアクセスが設定され、システム プログラムが特定されて実行されます。これにより、ファイアウォールによって引き起こされるアクセスの問題が完全に解決されます。
基本的に、異なるサーバー間のファイル転送と保存の問題が最終的に実現します。