あるサーバーから別のFTPサーバーにファイルをアップロードしたいのですが、ファイルをアップロードするためのコードは次のとおりですが、エラーがスローされます:
リモートサーバーからエラーが返されました:(550)File unavailable(e.g.、file not found、no access)。
この私のコード:
string CompleteDPath = "ftp URL";
string UName = "UserName";
string PWD = "Password";
WebRequest reqObj = WebRequest.Create(CompleteDPath + FileName);
reqObj.Method = WebRequestMethods.Ftp.UploadFile;
reqObj.Credentials = new NetworkCredential(UName, PWD);
FileStream streamObj = System.IO.File.OpenRead(Server.MapPath(FileName));
byte[] buffer = new byte[streamObj.Length + 1];
streamObj.Read(buffer, 0, buffer.Length);
streamObj.Close();
streamObj = null;
reqObj.GetRequestStream().Write(buffer, 0, buffer.Length);
reqObj = null;
どこがおかしいのか教えてもらえますか?
Ftpパスが以下のように設定されていることを確認してください。
string CompleteDPath = "ftp://www.example.com/wwwroot/videos/";
string FileName = "sample.mp4";
WebRequest reqObj = WebRequest.Create(CompleteDPath + FileName);
次のスクリプトは、ファイルやビデオをFTP経由で別のサービスにアップロードするのに最適です。
FtpWebRequest ftpClient = (FtpWebRequest)FtpWebRequest.Create(ftpurl + "" + username + "_" + filename);
ftpClient.Credentials = new System.Net.NetworkCredential(ftpusername, ftppassword);
ftpClient.Method = System.Net.WebRequestMethods.Ftp.UploadFile;
ftpClient.UseBinary = true;
ftpClient.KeepAlive = true;
System.IO.FileInfo fi = new System.IO.FileInfo(fileurl);
ftpClient.ContentLength = fi.Length;
byte[] buffer = new byte[4097];
int bytes = 0;
int total_bytes = (int)fi.Length;
System.IO.FileStream fs = fi.OpenRead();
System.IO.Stream rs = ftpClient.GetRequestStream();
while (total_bytes > 0)
{
bytes = fs.Read(buffer, 0, buffer.Length);
rs.Write(buffer, 0, bytes);
total_bytes = total_bytes - bytes;
}
//fs.Flush();
fs.Close();
rs.Close();
FtpWebResponse uploadResponse = (FtpWebResponse)ftpClient.GetResponse();
value = uploadResponse.StatusDescription;
uploadResponse.Close();
FTPサーバーにファイルをアップロードするサンプルコードを以下に示します
string filename = Server.MapPath("file1.txt");
string ftpServerIP = "ftp.demo.com/";
string ftpUserName = "dummy";
string ftpPassword = "dummy";
FileInfo objFile = new FileInfo(filename);
FtpWebRequest objFTPRequest;
// Create FtpWebRequest object
objFTPRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/" + 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();
try
{
// 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();
}
catch (Exception ex)
{
throw ex;
}
より高レベルのWebClient
型を使用して、よりクリーンなコードでFTP処理を行うこともできます。
using (WebClient client = new WebClient())
{
client.Credentials = new NetworkCredential(ftpUsername, ftpPassword);
client.UploadFile("ftp://ftpserver.com/target.Zip", "STOR", localFilePath);
}
あなたがまだ問題を抱えている場合、ここで私はこれをすべて乗り越えました。アップロードしようとしたディレクトリ内のファイルを完全に見ることができたにもかかわらず、同じエラーが表示されていました。つまり、ファイルを上書きしていました。
私のftp URLは次のように見えました:
// ftp://www.mywebsite.com/testingdir/myData.xml
FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://www.mywebsite.com/testingdir/myData.xml"
したがって、資格情報はテスターのユーザー名とPWを使用します。
request.Credentials = new NetworkCredential ("tester", "testerpw");
さて、私の "テスター" ftpアカウントは " ftp://www.mywebsite.com/testingdir "に設定されていますが、実際にftpしたときに[Explorerから]に「 ftp://www.mywebsite.com "とテスターの資格情報でログインすると、自動的に" testingdir "に送信されます。
そのため、C#でこれを機能させるには、urlを使用して終了しました。 ftp://www.mywebsite.com/myData.xml テスターアカウントの資格情報を入力すると、すべてが正常に機能しました。
渡すURLを確認してくださいWebRequest.Create
の形式は次のとおりです。
ftp://ftp.example.com/remote/path/file.Zip
.NET Frameworkを使用してファイルをアップロードする簡単な方法があります。
.NET frameworkを使用してFTPサーバーにファイルをアップロードする最も簡単な方法は、 WebClient.UploadFile
メソッド :
WebClient client = new WebClient();
client.Credentials = new NetworkCredential("username", "password");
client.UploadFile("ftp://ftp.example.com/remote/path/file.Zip", @"C:\local\path\file.Zip");
より高度な制御が必要な場合、WebClient
は提供しません( TLS/SSL暗号化 、ASCIIモード、アクティブモードなど)、 FtpWebRequest
、あなたと同じように。しかし、 Stream.CopyTo
:
FtpWebRequest request =
(FtpWebRequest)WebRequest.Create("ftp://ftp.example.com/remote/path/file.Zip");
request.Credentials = new NetworkCredential("username", "password");
request.Method = WebRequestMethods.Ftp.UploadFile;
using (Stream fileStream = File.OpenRead(@"C:\local\path\file.Zip"))
using (Stream ftpStream = request.GetRequestStream())
{
fileStream.CopyTo(ftpStream);
}
進行状況の監視やフォルダー全体のアップロードなど、さらに多くのオプションについては、以下を参照してください。
C#を使用してFTPにファイルをアップロード
ここに解決策があります!!!!!!
すべてのファイルをローカルディレクトリ(ex:D:\ Documents)からFTP url(ex:ftp:\ {ip address}\{sub dir name})にアップロードするには
public string UploadFile(string FileFromPath, string ToFTPURL, string SubDirectoryName, string FTPLoginID, string
FTPPassword)
{
try
{
string FtpUrl = string.Empty;
FtpUrl = ToFTPURL + "/" + SubDirectoryName; //Complete FTP Url path
string[] files = Directory.GetFiles(FileFromPath, "*.*"); //To get each file name from FileFromPath
foreach (string file in files)
{
FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(FtpUrl + "/" + Path.GetFileName(file));
request.Method = WebRequestMethods.Ftp.UploadFile;
request.Credentials = new NetworkCredential(FTPLoginID, FTPPassword);
request.UsePassive = true;
request.UseBinary = true;
request.KeepAlive = false;
FileStream stream = File.OpenRead(FileFromPath + "\\" + Path.GetFileName(file));
byte[] buffer = new byte[stream.Length];
stream.Read(buffer, 0, buffer.Length);
stream.Close();
Stream reqStream = request.GetRequestStream();
reqStream.Write(buffer, 0, buffer.Length);
reqStream.Close();
}
return "Success";
}
catch(Exception ex)
{
return "ex";
}
}