Laden Sie eine Datei mit der Codierung per FTP in C#
Folgende code ist gut für den Upload von text-Dateien, aber es nicht zum hochladen von JPEG-Dateien (nicht vollständig, der name der Datei ist gut, aber das Bild ist beschädigt):
private void up(string sourceFile, string targetFile)
{
try
{
string ftpServerIP = ConfigurationManager.AppSettings["ftpIP"];
string ftpUserID = ConfigurationManager.AppSettings["ftpUser"];
string ftpPassword = ConfigurationManager.AppSettings["ftpPass"];
//string ftpURI = "";
string filename = "ftp://" + ftpServerIP + "//" + targetFile;
FtpWebRequest ftpReq = (FtpWebRequest)WebRequest.Create(filename);
ftpReq.Method = WebRequestMethods.Ftp.UploadFile;
ftpReq.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
StreamReader stream = new StreamReader(sourceFile);
Byte[] b = System.Text.Encoding.UTF8.GetBytes(stream.ReadToEnd());
stream.Close();
ftpReq.ContentLength = b.Length;
Stream s = ftpReq.GetRequestStream();
s.Write(b, 0, b.Length);
s.Close();
System.Net.FtpWebResponse ftpResp = (FtpWebResponse)ftpReq.GetResponse();
MessageBox.Show(ftpResp.StatusDescription);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
Ich eine andere Lösung haben, können Sie eine Datei hochladen:
private void Upload(string sourceFile, string targetFile)
{
string ftpUserID;
string ftpPassword;
string ftpServerIP;
ftpServerIP = ConfigurationManager.AppSettings["ftpIP"];
ftpUserID = ConfigurationManager.AppSettings["ftpUser"];
ftpPassword = ConfigurationManager.AppSettings["ftpPass"];
FileInfo fileInf = new FileInfo(sourceFile);
FtpWebRequest reqFTP;
//Create FtpWebRequest object from the Uri provided
reqFTP = (FtpWebRequest)(FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "//" + targetFile)));
//Provide the WebPermission Credintials
reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
//Bypass default lan settings
reqFTP.Proxy = null;
//By default KeepAlive is true, where the control connection is not closed
//after a command is executed.
reqFTP.KeepAlive = false;
//Specify the command to be executed.
reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
//Specify the data transfer type.
reqFTP.UseBinary = true;
//Notify the server about the size of the uploaded file
reqFTP.ContentLength = fileInf.Length;
//The buffer size is set to 2kb
int buffLength = 2048;
Byte[] buff;
buff = new byte[buffLength];
int contentLen;
//Opens a file stream (System.IO.FileStream) to read the file to be uploaded
FileStream fs = fileInf.OpenRead();
try
{
//Stream to which the file to be upload is written
Stream strm = reqFTP.GetRequestStream();
//Read from the file stream 2kb at a time
long filesize = fs.Length;
int i=0;
contentLen = fs.Read(buff, 0, buffLength);
//Till Stream content ends
while (contentLen != 0)
{
Application.DoEvents();
//Write Content from the file stream to the FTP Upload Stream
strm.Write(buff, 0, contentLen);
contentLen = fs.Read(buff, 0, buffLength);
i = i + 1;
//Double percentComp = (i * buffLength) * 100 /filesize;
//ProgressBar1.Value = (int)percentComp;
}
//Close the file stream and the Request Stream
strm.Close();
fs.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Upload Error");
}
}
Aber hier habe ich das gegenteilige problem - das Bild ist gut, aber der name der Datei beschädigt ist.
Weiß ich, es ist, weil der Kodierung, aber ich weiß nicht, wie das Byte array haben die gewünschte Codierung...
Ich kann nicht verstehen, warum hätten Sie das problem mit beschädigten Dateinamen mit dem zweiten code, aber nicht mit dem ersten code. Und warum sollten die akzeptierten Antworten helfen mit, dass. In allen Fällen geben Sie den Namen der Datei genau die gleiche Weise.
Tut mir Leid, Martin. Ich habe die Frage vor einem Jahrzehnt. Ich kann mich nicht mehr erinnern was das problem war und was die Lösung war. Ich denke, man sollte einen neuen thread aufmachen mit deiner eigenen Frage.
Ich habe keine Frage, ich Frage mich nur, was ist der Sinn von deiner Frage und der Antwort 🙂
🙂 ... meine Vergangenheit ist die Jagd auf mich ;)... ich wirklich nicht erinnern. Wahrscheinlich habe ich etwas falsch(bug) und es ist sogar möglich, dass Microsoft hatte einen bug, der wurde behoben...
Tut mir Leid, Martin. Ich habe die Frage vor einem Jahrzehnt. Ich kann mich nicht mehr erinnern was das problem war und was die Lösung war. Ich denke, man sollte einen neuen thread aufmachen mit deiner eigenen Frage.
Ich habe keine Frage, ich Frage mich nur, was ist der Sinn von deiner Frage und der Antwort 🙂
🙂 ... meine Vergangenheit ist die Jagd auf mich ;)... ich wirklich nicht erinnern. Wahrscheinlich habe ich etwas falsch(bug) und es ist sogar möglich, dass Microsoft hatte einen bug, der wurde behoben...
InformationsquelleAutor Asaf | 2010-08-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen, dieses bit:
s.Write(b, 0, b.Length);
innerhalb einerusing
block?Da
Stream s
ist einIDisposable
Ressource.Hier ist der Magische Unterschied ist auch
byte[] b = File.ReadAllBytes(sourceFile);
im Vergleich zu anderen Beispiele gefunden akaEncoding.UTF8.GetBytes(stream.ReadToEnd())
.InformationsquelleAutor Jesse C. Slicer
Sollten Sie mit einem
Stream
zum Lesen von Binär-Dateien, die nicht für eineStreamReader
.StreamReader
ist ausgelegt zum Lesen von text-Dateien nur.InformationsquelleAutor Mark
In deinem ersten code Beispiel, ermöglichen die binäre übertragung:
FtpWebRequest.UseBinary = true
. Sonst wird es zu konvertieren, was es denkt, sind textliche Zeilenenden zwischen den verschiedenen Plattform-Konventionen (sind aber eigentlich Teil des Bildes).Ja, siehe Mark ' s Antwort: Sie versuchen, die Datei zu Lesen als UTF8 text. Graben Sie das StreamReader und Lesen die bytes direkt aus dem stream, z.B. mit Strom.Read().
InformationsquelleAutor Paul Ruane
Ihre zweite snippet tut es der richtige Weg. Es FileStream verwendet, nicht StreamReader. StreamReader eignet sich nur für text-Dateien.
InformationsquelleAutor Hans Passant
System.Text.Encoding.UTF8.GetBytes(stream.ReadToEnd());
Nicht machen, es sei denn, Ihr stream der Inhalt text. Ändern Sie Ihre Funktion akzeptiert einen booleschen parameter "binary", und das letztere, der Arbeitsweise, wenn das flag gesetzt ist.
InformationsquelleAutor Jonathan
Wenn Sie dieses problem haben: Der angeforderte FTP-Befehl wird nicht unterstützt bei Verwendung von HTTP
müssen Sie einen proxy im Null-oder gar Nichts.
Können Sie sehen, dieses blog.
http://mycodetrip.com/2008/10/29/fix-for-error-the-requested-ftp-command-is-not-supported-when-using-http-proxy_118/comment-page-1/#comment-2825
Dank.
InformationsquelleAutor Erick Martinez