Entwickler-Ecke

IO, XML und Registry - FTP-Upload -> Format von Datei geht verloren


Christoph1972 - Do 10.06.10 16:58
Titel: FTP-Upload -> Format von Datei geht verloren
Hallo Leute,

ich sende ein Worddokument auf einen FTP-Server, das funktioniert auch soweit. Wenn ich aber das Dokument wieder runterlade und versuche es zu öffnen, dann kommt eine Fehlermeldung „Das Dokument kann nicht konvertiert werden. Wdc637“ oder so ähnlich.

Was mache ich denn beim upload falsch?



C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
using (FileStream myFTPFileStream = new FileStream(transferFile, FileMode.Open))
{
    FtpWebRequest ftp = WebRequest.Create(FTPSettings.Host + @"/" + FTPSettings.Directory + "/" + fileName) as FtpWebRequest;
    ftp.Method = WebRequestMethods.http://Ftp.UploadFile;
    ftp.Credentials = new NetworkCredential(FTPSettings.User, FTPSettings.PW);
    ftp.Timeout = 10000;
    
    FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();
    response.Close();
   
    Stream requestStream = ftp.GetRequestStream();

    const Int16 bufferLenght = 2048;
    Byte[] buffer = new Byte[bufferLenght];

    Int32 readBytes = myFTPFileStream.Read(buffer, 0, bufferLenght);

    do
    {
        readBytes = myFTPFileStream.Read(buffer, 0, bufferLenght);
        requestStream.Write(buffer, 0, bufferLenght);

    } while (readBytes != 0);

    requestStream.Close();
    myFTPFileStream.Close();
}




Über Tipps und Anregungen bin ich wie immer dankbar!


Kha - Do 10.06.10 21:07

Warum wirfst du denn den ersten Block einfach weg (vor der Schleife)? Außerdem darfst du natürlich nur so viele Bytes schreiben, wie readBytes angibt.


Christoph1972 - Fr 11.06.10 15:43

Ah, prima! Bisher habe ich immer nur Textdatein versendet, da war das kein Problem. Ich habe das jetzt korregiert:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
const Int16 bufferLenght = 1024;//Buffer größe
Int64 buffers = Convert.ToInt64(myFTPFileStream.Length / bufferLenght); //Anzahl der Buffers
Int32 lastBuffer = Convert.ToInt32(myFTPFileStream.Length - (buffers * bufferLenght));//Der Rest

Byte[] buffer = new Byte[bufferLenght];

for (Int32 i = 0; i < buffers; i++)
{
    myFTPFileStream.Read(buffer, 0, buffer.Length);
    requestStream.Write(buffer, 0, buffer.Length);
}
if (lastBuffer > 0)
{
    myFTPFileStream.Read(buffer, 0, lastBuffer);
    requestStream.Write(buffer, 0, lastBuffer);
}




Vielen Dank für die Unterstützung!


Kha - Fr 11.06.10 20:41

Dein bisheriger Code war doch im Prinzip ok, den hättest du ruhig beibehalten können :) .

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
    Byte[] buffer = new Byte[bufferLenght];

    int readBytes;

    do
    {
        readBytes = myFTPFileStream.Read(buffer, 0, bufferLenght);
        requestStream.Write(buffer, 0, readBytes);

    } while (readBytes != 0);

Über Convert lese ich mal hinweg ;) . Warum du überhaupt Int16 und Int64 ins Spiel bringst, habe ich auch nicht verstanden.