konto usunięte

Temat: Upload pliku ZIP

Witam,
Mam kolejny problem i szczerze mówiąc nie wiem co jest grane. Mam na kompie plik zip, który waży 1mb, po uploadzie poprzez własny program, waży on ponad 2mb ;/ Gdy odpalam skrypt php do rozpakowania to dostaje błąd, że jest zły rozmiar pliku. Natomiast jak sam wgram poprzez klienta FTP to wszystko jest dobrze. W czym może tkwić problem?

Upload robię w ten sposób:

Uri url = new Uri("ftp://" + serwer + "/domains/" + web + "/public_html/" + plik);
FtpWebRequest ftp = (FtpWebRequest)WebRequest.Create(url);
ftp.Credentials = new NetworkCredential(login, haslo);
ftp.Method = WebRequestMethods.Ftp.UploadFile;
ftp.UsePassive = true;
FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();
StreamReader sourceStream = new StreamReader(plik);
byte[] fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());
sourceStream.Close();
ftp.ContentLength = fileContents.Length;

Stream requestStream = ftp.GetRequestStream();
requestStream.Write(fileContents, 0, fileContents.Length);
requestStream.Close();

Temat: Upload pliku ZIP

Po pierwsze ustaw przesyłanie na binarne:

ftp.UseBinary = true;

i zapomnij o jakimś "kodowaniu" znaków - to tylko w trybie tekstowym.

Zwykłe byte[] fileContents = File.ReadAllBytes("jakistam.zip"); zrobi swoją robotę.

konto usunięte

Temat: Upload pliku ZIP

W tej linii co podałeś:

byte[] fileContents = File.ReadAllBytes(sourceStream.ReadToEnd());
Wywala mi błąd: Illegal characters in path

Temat: Upload pliku ZIP

Nie dziwię się. Podajesz do metody, która oczekuje ścieżki do pliku, megabajtowy strumień znaków :D Podaj tam po prostu ścieżkę.

konto usunięte

Temat: Upload pliku ZIP

Z jednym plikiem działa bez problemu :) Z kilkoma jest inaczej, jak skończy uploadować jeden, powinien zacząć drugi, ale nie zaczyna bo wyskakuje błąd:
cannot access a disposed object named system.net.sockets.networkstream

Temat: Upload pliku ZIP

Wrzuć cały kod do wysyłania plik po pliku. Na ślepo strzelam, że zwalniasz gdzieś requestStream, który jest ownerem NetworkStream'a.

konto usunięte

Temat: Upload pliku ZIP


try{
string foldery = "admin.zip,includes.zip";
string[] files = foldery.Split(',');

foreach(string file in files)
{
SQLiteConnection sql_polaczenie = new SQLiteConnection("Data Source=data.db;Version=3;New=False;Compress=False;Pooling=False");
sql_polaczenie.Open();
SQLiteCommand sql_cmd = new SQLiteCommand("SELECT * FROM konfiguracje where adres=@adres and id=@id", sql_polaczenie);
sql_cmd.Parameters.Add(new SQLiteParameter("adres", adres));
sql_cmd.Parameters.Add(new SQLiteParameter("id", id));
SQLiteDataReader sqlite_datareader = sql_cmd.ExecuteReader();

while (sqlite_datareader.Read())
{
string serwer = Convert.ToString(sqlite_datareader["serwerftp"]);
string login = (String)sqlite_datareader["loginftp"];
string haslo = (String)sqlite_datareader["hasloftp"];
string rodzaj = (String)sqlite_datareader["rodzaj"];
string subdomena = (String)sqlite_datareader["nazwasubdomena"];
string tytul = (String)sqlite_datareader["tytul"];
string urls = (String)sqlite_datareader["adres"];
string www = urls.Replace("http://www.", "");
string web = www.Replace("/", "");
string[] nazwa = file.Split(new char[] { '\\' });
foreach (string plik in nazwa)
{
if (rodzaj == "domena")
{
Uri url = new Uri("ftp://" + serwer + "/domains/" + web + "/public_html/" + plik);
FtpWebRequest ftp = (FtpWebRequest)WebRequest.Create(url);
ftp.Credentials = new NetworkCredential(login, haslo);
ftp.Method = WebRequestMethods.Ftp.UploadFile;
ftp.UseBinary = true;
ftp.KeepAlive = false;
FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();
byte[] fileContents = File.ReadAllBytes(plik);

ftp.ContentLength = fileContents.Length;

Stream requestStream = ftp.GetRequestStream();
requestStream.Write(fileContents, 0, fileContents.Length);
requestStream.Close();
}
else
{
Uri url = new Uri("ftp://" + serwer + "/domains/" + web + "/public_html/" + subdomena + "/" + plik);
FtpWebRequest ftp = (FtpWebRequest)WebRequest.Create(url);
ftp.Credentials = new NetworkCredential(login, haslo);
ftp.Method = WebRequestMethods.Ftp.UploadFile;
ftp.UseBinary = true;
FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();
byte[] fileContents = File.ReadAllBytes(plik);
ftp.ContentLength = fileContents.Length;

Stream requestStream = ftp.GetRequestStream();
requestStream.Write(fileContents, 0, fileContents.Length);
requestStream.Close();
}
}
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Błąd instalacji FTP", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
To cały kod :)Paweł Cyrklaf edytował(a) ten post dnia 15.12.11 o godzinie 09:18

konto usunięte

Temat: Upload pliku ZIP

Adrian dobrze zgadł:
requestStream.Close();
Ale bardzo istotna rada: zaoszczędzisz sporo czasu a i tym samym pieniędzy, gdybyś stosował single responsibility principle (SRP) odnośnie metod. Jedna metoda pobiera dane z DB, inna metoda wysyła plik przez FTP i - co istotne - te metody są w 100% izolowane, tj. mogę testować twój upload plików bez żadnej wiedzy o twojej DB. Dodatkowe korzyści takie, że inni programiści mogą niezależnie implementować metody a także łatwiej będzie wykorzystać te zasoby w kolejnym projekcie.
Ponadto uważam, że jest bardzo źle gdy przetrzymujesz otwarty data reader i jednocześnie otwierasz połączenia TCP. Zauważ, że SRP automatycznie blokuje takie rozwiązania.

Aby zaimplementować upload kilku plików będziesz musiał nieźle ten przebudować - proponuję więc przy okazji dodać minimum dwie metody.

Temat: Upload pliku ZIP

No tak, ślepy byłem, że tego Close'a nie dojrzałem, ale już późno było.

Pełna zgoda co do SRP. Tutaj to jest jeden wielki moloch, który w dodatku jest w jednym wielkim trajkeczu i tak naprawdę nie wiadomo, co się posypało w razie czego, a jest kilka newralgicznych miejsc (dobrze, że to tylko SQLite, a nie np. Oracle :] ).

I potem mamy aplikacje, które informują nas szczegółowo, że "Wystąpił błąd".

Utrzymanie otwartego DataReadera podczas jakichś większych operacji rozumiałbym, gdyby to była aplikacja pamięciożerna i koniecznie szybka (setki MB danych z bazy przerzucane gdzieś) nawet za cenę problemów. Ale tutaj spokojnie można było wczytać dane do kolekcji (a nawet prościej skorzystać z DataAdaptera i DataTable), a potem je przetwarzać, zamykając zawczasu połączenie z DB.

I jeszcze jedno - konkretnymi, pasującymi do sytuacji trajkeczami należy obejmować jak najmniejsze partie kodu, żeby jeszcze dało się może coś uratować. No chyba, że nam na tym nie zależy kompletnie, a userowi chcemy wyświetlić tylko "no way, man" :) Poza tym to się zemści także na programiście albo wdrożeniowcu, bo przecież nie zawsze możemy to uruchomić spod VSa, tylko mamy gołego EXEka i w razie problemu nie wiemy, co się zepsuło, poza naszym MsgBoxem. A może po prostu ktoś zapomniał wgrać plik SQLite'a? A może zapomniał włożyć kabel sieciowy? Może wyjątek da się naprawić bez grzebania w exeku?Adrian Olszewski edytował(a) ten post dnia 15.12.11 o godzinie 12:46

konto usunięte

Temat: Upload pliku ZIP

Dobrze dobrze, dziękuję za wszelkie rady :) Jednak mam jeszcze jeden problem, chodzi o upload tylko jednego pliku, soft wgrywa bez problemu plik zip na serwer, jednak po jego wgraniu zaraz wywala błąd o którym wspominałem.

Natomiast jak wywalę z kodu: requestStream.Close(); to program utworzy tylko pusty plik, i zaraz wywala error ;/
Piotr Głudkowski

Piotr Głudkowski Rzucam się na
wszystko to, co jest
ciekawe i wymaga
rusze...

Temat: Upload pliku ZIP

.Piotr Głudkowski edytował(a) ten post dnia 15.12.11 o godzinie 16:30

konto usunięte

Temat: Upload pliku ZIP

I brakuje mi pomysłów ;/

konto usunięte

Temat: Upload pliku ZIP

Paweł Cyrklaf:
I brakuje mi pomysłów ;/
W ogóle przestawiłeś kolejność response/request.

Zobacz, co znalazłem w dokumentacji:
IMPORTANT: Close the request stream before sending ....
Zatem:
1. Otwiersz request, wysyłasz na request, zamykasz request
2. dopiero potem bierzesz GetResponse, zamykasz response i możesz sobie sprawdzić response.StatusDescription

Zatem przenieś FtpWebResponse response = (FtpWebResponse)ftp.GetResponse(); na sam dół i dodaj response.Close();

W razie dalszych problemów wklej kod zrefaktorowanej metody robiącej wyłącznie upload.

konto usunięte

Temat: Upload pliku ZIP

I w taki oto sposób wszystko działa jak należy, dziękuję za pomoc :) Nawet na logikę, najpierw jest pytanie, później odpowiedź, a u mnie jedno z drugim pomieszane było.
Jan Kowalski

Jan Kowalski Specjalista

Temat: Upload pliku ZIP

Może najpierw postaraj się zrozumieć jaki jest model I/O w .NET?
Bo z tego co widzę, używasz tutaj strasznie dużo rzeczy (db, sockets, file i/o), bez rozumienia mechanizmów ich dzialania.

Najpierw uczymy się dodawania a dopiero później tabliczki mnożenia ;)

Temat: Upload pliku ZIP

Życie :) Czasem mamy szczęście i dostajemy ofertę, na której i na dalszej współpracy bardzo nam zależy, a jednocześnie nie umiemy czegoś, co musimy w tej pracy wykorzystać. Uczymy się więc po omacku, próbując to ogarnąć. I lepszej nauki, niż taka "droga przez mękę", Paweł mieć nie będzie :)

Następna dyskusja:

problem z odczytem pliku XML




Wyślij zaproszenie do