クライアントのftpサイトの1つにファイルをアップロードする小さなWindowsフォームアプリケーションを作成しました。しかし、私が抱えている問題は、ローカルマシンでこのアプリケーションを実行すると、ファイルが正常にアップロードされることです。しかし、サーバーでこのプログラムを実行すると、このエラーメッセージが表示されます。
リモートサーバーがエラーを返しました:(550)ファイルが利用できない(たとえば、ファイルが見つからない、ファイルにアクセスできない)、この行 'objFTPRequest.GetRequestStream();'。
誰かが理由を知っていますか?ファイアウォールなどを設定する必要がありますか?これが私のコードです。
FileInfo objFile = new FileInfo(filename);
FtpWebRequest objFTPRequest;
// Create FtpWebRequest object
objFTPRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/outbox/" + objFile.Name));
// Set Credintials
objFTPRequest.Credentials = new NetworkCredential(ftpUserName, ftpPassword);
// By default KeepAlive is true, where the control connection is
// not closed after a command is executed.
objFTPRequest.KeepAlive = false;
// Set the data transfer type.
objFTPRequest.UseBinary = true;
// Set content length
objFTPRequest.ContentLength = objFile.Length;
// Set request method
objFTPRequest.Method = WebRequestMethods.Ftp.UploadFile;
// Set buffer size
int intBufferLength = 16 * 1024;
byte[] objBuffer = new byte[intBufferLength];
// Opens a file to read
FileStream objFileStream = objFile.OpenRead();
// Get Stream of the file
Stream objStream = objFTPRequest.GetRequestStream();
int len = 0;
while ((len = objFileStream.Read(objBuffer, 0, intBufferLength)) != 0)
{
// Write file Content
objStream.Write(objBuffer, 0, len);
}
objStream.Close();
objFileStream.Close();
このエラーは、サーバーにファイルが存在しない、ファイルのセキュリティ権限などのようないくつかの理由により発生する可能性があります。
まず、エラーの正確な原因を見つける必要があります。これは、次のコードを使用して実現できます。
try
{
//Your code
}
catch(WebException e)
{
String status = ((FtpWebResponse)e.Response).StatusDescription;
}
エラーの正確な原因がわかれば、解決に進むことができます。
参照できるリンクは次のとおりです
http://forums.asp.net/t/1777881.aspx/1
http://www.dreamincode.net/forums/topic/76361-file-upload-to-server/
これを試してください: ftp://xxx.xxx.xx.xx:21 // path/filename
サーバーアドレスの後にある「//」は、ルートディレクトリから開始します。 ftp://xxx.xxx.xx.xx:21/path/filename を持っていたにもかかわらず、正しいディレクトリに移動しませんでした。
私は同じ問題に遭遇し、これが私がやったことです:
設定する権限を示すために、4つの写真を使用できます。
もっとシンプルかもしれません。
私は同様の問題に直面しており、提案されたすべての解決策を試しましたが、誰も作業しませんでした。私はこのように簡単な方法で把握しています:見てみましょう
私の終わりに間違ったコード
Dim request As Net.FtpWebRequest = CType(FtpWebRequest.Create("ftp://xxx.xxx.xxx.xxx/files"), FtpWebRequest)
この単純なものに変更します。
Dim request As Net.FtpWebRequest = CType(FtpWebRequest.Create("ftp://xxx.xxx.xxx.xxx/files/youfilename.ext"), FtpWebRequest)
次に、fillリクエストで処理し、サーバーに送信します:)
それで全部です。
サーバー上のすべての権限が正常に機能し、正しい資格情報を使用していることを確認してください。
私が同じ問題を抱えていたとき、私は上記のすべてを試しましたが、1日後に「/」とフォルダ名の間に空白が含まれているuri用に作成したパス
string uri="192.168.1.101/ Sync/Image.jpg";
上記の文字列は
string uri="192.168.1.101/Sync/Image.jpg";
この小さな間違いも同じエラーをスローし、有効なエラーです。これは、「/」とフォルダ/ファイル名の間に空白が含まれている場合、ファイルの有効なパスではないためです
私も最近この問題を抱えていました。私が見つけたのは、ftpUploadFileを使用すると、ルーチンがファイルをルートftpフォルダーに配置しようとしていることです。通常のコマンドラインftpは正常に機能しました。ただし、コマンドラインftpからpwdコマンドを発行すると、この特定のサーバーがログイン時に異なる現在のディレクトリを設定していることが明らかになりました。 ftpUploadFileを変更してこのフォルダーを含めると、問題は解決しました。
この問題を解決するには、実際のコマンドを発行する前に、System.Net.FtpWebRequestコマンドを.Net Framework 2.0/3.5で使用されていた以前の動作に強制的に戻し、追加のCWDコマンドを発行する必要があります。 。
これを行うには、System.Net.FtpWebRequestクラスのインスタンスが呼び出される前に、次のコードを配置する必要があります。以下のコードは、アプリケーションドメイン全体の設定を変更するため、一度呼び出すだけで済みます。
private static void SetMethodRequiresCWD()
{
Type requestType = typeof(FtpWebRequest);
FieldInfo methodInfoField = requestType.GetField("m_MethodInfo", BindingFlags.NonPublic | BindingFlags.Instance);
Type methodInfoType = methodInfoField.FieldType;
FieldInfo knownMethodsField = methodInfoType.GetField("KnownMethodInfo", BindingFlags.Static | BindingFlags.NonPublic);
Array knownMethodsArray = (Array)knownMethodsField.GetValue(null);
FieldInfo flagsField = methodInfoType.GetField("Flags", BindingFlags.NonPublic | BindingFlags.Instance);
int MustChangeWorkingDirectoryToPath = 0x100;
foreach (object knownMethod in knownMethodsArray)
{
int flags = (int)flagsField.GetValue(knownMethod);
flags |= MustChangeWorkingDirectoryToPath;
flagsField.SetValue(knownMethod, flags);
}
}
ターゲットフォルダー「送信トレイ」が存在することを確認します。これがエラー550の問題でした。
アップロードする前に、単にターゲットディレクトリの「出力」を作成します。
try
{
WebRequest request = WebRequest.Create("ftp://" + ftpServerIP + "/outbox");
request.Credentials = new NetworkCredential("user", "password");
request.Method = WebRequestMethods.Ftp.MakeDirectory;
using (var resp = (FtpWebResponse)request.GetResponse())
{
Console.WriteLine(resp.StatusCode);
}
}
catch (WebException ex)
{
FtpWebResponse response = (FtpWebResponse)ex.Response;
if (response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable)
{
response.Close();
//already exists
}
else
{
response.Close();
//doesn't exists = it's another exception
}
}
私は同じ問題を抱えていました、ftpuriとユーザー名のパスと比較すると解決されましたftpアクセスを作成するときにパスを/ディレクトリ名として選択しました
ftpuriでディレクトリ名を含めるとエラーが発生し、ディレクトリ名を削除すると解決します。
エラーのあるftpuri
" ftp://www.example.com/Project/yourfilename.ds "
ftpuri解決済み
" ftp://www.example.com/yourfilename.ds "
ftpアクセスフォルダー「/ Project」
帽子を指輪に投げ込むだけで、同じエラーが発生していました。 FTPRequestが同じコンピューター上のFTPサービスからファイルを要求していたとき(同じIP)。リクエストでは、マシンのIPアドレスを使用していましたが、それを127.0.0.1に変更すると動作しました。興味深いことに、他のIPアドレスからのリクエストは処理され、ファイルはダウンロードされました。それ自体からではありません。
それが誰かを助けたことを願っています。
私の場合、ftpアドレスで参照されているルートフォルダーがありませんでした。フォルダを作成した後、問題は解決しました。
この問題がありました。 Filezillaは大丈夫でしたが、.netは大丈夫でした。 wordpressサーバーへ。それを機能させるために、これからコードを変更しました。
ftp://XXX.XXX.XXX.XXX//folder// "+ txtFile.Text
に:
ftp:// [FTPNAME] @ XXX.XXX.XXX.XXX // "+ txtFile.Text
そして、ありがたいことに動作します。
これがWordpress FTPフォルダーに固有のものかどうかわかりません。
私は解決策を見つけました。問題は、ftpユーザーの現在の作業ディレクトリです。 ftp:///path/test.txtのようなURLを入力すると、作業ディレクトリの相対パスとして使用されます。たとえば、CWDは/ testであり、使用されるパスは/test/path/test.txtです。絶対パスを使用する場合は、ftp:////path/test.txtのようなURLを入力する必要があります。その後、ファイルは例外なくフォルダー/path/test.txtにアップロードされます。