Pobieranie dużej ilości plików ASP(c#)

0

Tworzę aplikację do zarządzania dużą ilością zdjęć. Podczas testowania wszystko ładnie działa jak na razie testuję aplikacje na małej ilości obrazów. Głównie chodzi mi o import zdjęć z dysku na serwer. Jeśli użytkownik wskaże folder w którym będzie znajdować się duża ilość plików czas pobrania z dysku na serwer zapewne będzie trwał trochę stąd też moje pytanie:

**Istnieje jakaś możliwość wyświetlenia informacji na temat aktualnego statusu pobierania np. "Do końca pobierania zostało 400 zdjęć" itd. **

To fragment kodu który wykorzystuję do importu:

 
foreach (FileInfo file in directory.GetFiles())
{
  if (file.Exists == true)
   {
      string isPicture = file.Name.Substring(file.Name.Length - 3).ToUpper();
      if ((isPicture == "JPG") | (isPicture == "GIF") | (isPicture == "ICO") | (isPicture == "BMP") | 
      (isPicture == "SWF") | (isPicture == "PNG") | (isPicture == "TIF") )
         {
                                    
            fileName = newFileName(file.Name, counter);
            file.CopyTo(Server.MapPath("Employee\\ImageStorage\\" + fileName));
            Bitmap bmp = CreateThumbnail(Server.MapPath("Employee\\ImageStorage\\" + fileName),300, 120);
             bmp.Save(Server.MapPath("Employee\\Thumbnails\\" + fileName));
                                      
          }

          counter = counter + 1;
     }
 }

                     
0
foreach (FileInfo file in directory.GetFiles())
{
  if (file.Exists == true)

Zastanawiam się, czy plik zwrócony przez metodę GetFiles() może nie istnieć...

      string isPicture = file.Name.Substring(file.Name.Length - 3).ToUpper();
      if ((isPicture == "JPG") | (isPicture == "GIF") | (isPicture == "ICO") | (isPicture == "BMP") | 
      (isPicture == "SWF") | (isPicture == "PNG") | (isPicture == "TIF") )

Czyli plik jpeg albo tiff nie są Twoim zdaniem obrazami? Prościej użyć metody Path.GetExtension() zamiast pisać wszystko po swojemu.

kradzik napisał(a)

**Istnieje jakaś możliwość wyświetlenia informacji na temat aktualnego statusu pobierania np. "Do końca pobierania zostało 400 zdjęć" itd. **

Czemu nie, z wykorzystaniem AJAXa można prawie wszystko. Tutaj wystarczyłoby, żeby timer odpytywał jakąś metodę serwera zwracającą liczbę pozostałych plików i odświeżał HTML.

Jeśli użytkownik wskaże folder w którym będzie znajdować się duża ilość plików czas pobrania z dysku na serwer zapewne będzie trwał trochę

Pytanie zasadnicze - jak użytkownik aplikacji webowej ma wskazać folder na dysku?

0

"Czyli plik jpeg albo tiff nie są Twoim zdaniem obrazami? Prościej użyć metody Path.GetExtension() zamiast pisać wszystko po swojemu."

Sa obrazami dlatego tez sprawdzam typ pliku. Jeśli sa to pliki z rozszerzeniem zawartym w instrukcji **if ** zostaną zaimportowane. Chciałem unikać sytuacji gdy w folderze będą znajdować się inne pliki np *.rar, *db itp. w takiej sytuacji nie mogą one zostać pobrane.

"Pytanie zasadnicze - jak użytkownik aplikacji webowej ma wskazać folder na dysku? "

Użytkownik podaje ścieżkę do folderu w TextBoxie. Jesli podana ścieżka istnieje pliki z folderu zostają zaimportowane

if (Directory.Exists(TextBoxPath.Text))
{
    DirectoryInfo directory = new DirectoryInfo(TextBoxPath.Text);
    foreach (FileInfo file in directory.GetFiles())
    {
      //kod
    }
}

Szukałem długo sposobu aby móc w oknie dialogowym wskazać folder z którego zostaną zaimportowane pliki jednak znalazłem tylko płatne narzędzia które rozwiązują ten problem . Komponent FileLoad umożliwia jedynie wskazanie jednego pliku, z tego co mi wiadomo nie ma możliwości pogrania z niego ścieżki do folderu.

0
kradzik napisał(a)

Sa obrazami dlatego tez sprawdzam typ pliku. Jeśli sa to pliki z rozszerzeniem zawartym w instrukcji **if ** zostaną zaimportowane. Chciałem unikać sytuacji gdy w folderze będą znajdować się inne pliki np *.rar, *db itp. w takiej sytuacji nie mogą one zostać pobrane.

Przecież Twój if nie dopuszcza plików o rozszerzeniach jpeg ani tiff. Na dodatek zakładasz, że rozszerzenie pliku ma zawsze trzy znaki.

Użytkownik podaje ścieżkę do folderu w TextBoxie. Jesli podana ścieżka istnieje pliki z folderu zostają zaimportowane

if (Directory.Exists(TextBoxPath.Text))
{
    DirectoryInfo directory = new DirectoryInfo(TextBoxPath.Text);
    foreach (FileInfo file in directory.GetFiles())
    {
      //kod
    }
}

Taa, na pewno. Masz w ogóle świadomość, że piszesz aplikację webową?

0

"Przecież Twój if nie dopuszcza plików o rozszerzeniach jpeg ani tiff. Na dodatek zakładasz, że rozszerzenie pliku ma zawsze trzy znaki."
To jest caly if nie wklejalem calego kodu ostatnio


 string isPicture = file.Name.Substring(file.Name.Length - 3).ToUpper();
 if ((isPicture == "JPG") | (isPicture == "GIF") | (isPicture == "ICO") | (isPicture == "BMP") | (isPicture == "SWF") | (isPicture == "PNG")
  | (isPicture == "TIF") | file.Name.Substring(file.Name.Length - 4).ToUpper() == "JPEG") {}

"Taa, na pewno. Masz w ogóle świadomość, że piszesz aplikację webową? "

Wydaje mi sie ze mimo ze jest to webowa aplikacja, z chwila gdy użytkownik wejdzie na stronie ten kod wykona się po stronie klienta?? Jeśli jest to zle rozwiązanie napisz prosze dlaczego .

 if (Directory.Exists(TextBoxPath.Text))
{
    DirectoryInfo directory = new DirectoryInfo(TextBoxPath.Text);
    foreach (FileInfo file in directory.GetFiles())
    {
       file.CopyTo(Server.MapPath("Employee\\ImageStorage\\" + fileName));
       Bitmap bmp = CreateThumbnail(Server.MapPath("Employee\\ImageStorage\\" + fileName), 300, 120);
       bmp.Save(Server.MapPath("Employee\\Thumbnails\\" + fileName));
    }
}
0
string isPicture = file.Name.Substring(file.Name.Length - 3).ToUpper();
 if ((isPicture == "JPG") | (isPicture == "GIF") | (isPicture == "ICO") | (isPicture == "BMP") | (isPicture == "SWF") | (isPicture == "PNG")
  | (isPicture == "TIF") | file.Name.Substring(file.Name.Length - 4).ToUpper() == "JPEG") {}

Nie rozumiem czemu nie chcesz użyć po prostu Path.GetExtension(file.Name), tylko samemu wielokrotnie wycinać.
Czemu używasz operatora |, a nie ||?

kradzik napisał(a)

Wydaje mi sie ze mimo ze jest to webowa aplikacja, z chwila gdy użytkownik wejdzie na stronie ten kod wykona się po stronie klienta?? Jeśli jest to zle rozwiązanie napisz prosze dlaczego .

Kod wykonuje się tam, gdzie znajduje się plik wykonywalny, czyli w tym przypadku na serwerze.

Z poziomu przeglądarki nie możesz mieć dostępu do katalogów na dysku. Przecież wtedy ktoś mógłby napisać skrypt JS, który przegląda Ci dysk i ściąga z niego dane.

Chyba jedyne co możesz zrobić, to użyć jakiegoś flashowego uploadera dla wielu plików (ale na pewno nie do katalogu). Albo prościej - możesz pliki pakować do zipa, wówczas zwykły FileUpload da radę go pobrać, na serwerze sobie rozpakujesz i zrobisz z grafikami co chcesz.

0

Z poziomu przeglądarki nie możesz mieć dostępu do katalogów na dysku. Przecież wtedy ktoś mógłby napisać skrypt JS, który przegląda Ci dysk i ściąga z niego dane.

Chyba jedyne co możesz zrobić, to użyć jakiegoś flashowego uploadera dla wielu plików (ale na pewno nie do katalogu). Albo prościej - możesz pliki pakować do zipa, wówczas zwykły FileUpload da radę go pobrać, na serwerze sobie rozpakujesz i zrobisz z grafikami co chcesz.

Nie wiedziałem o tym myślałem ze to zadziała dzięki za rade. Zaimplementowałem mechanizm, który wczytuje za pomoca FileUpload plik ZIP (rar nie chce cos obsługiwać chyba ZipInputStream umozliwia prace tylko z ZIP) po czym rozpakowuje go na serwerze. Waszym zdaniem takie rozwiązanie jak poniżej powinno zadziałać?? Lokalnie działa chce się tylko upewnić, ze jak wrzucę to na serwer to tez nie będzie problemów

 protected void Button3_Click(object sender, EventArgs e)
 {
     string fileName = Path.GetFileName(FileUpload2.FileName);
     string directoryName = fileName.Substring(0,fileName.Length - 4);
     FileUpload2.SaveAs(Server.MapPath("Customer\\ImageStorage\\") + fileName);
     UnZipFile(Server.MapPath("Customer\\ImageStorage\\" + fileName), directoryName);     
 } 
public  bool UnZipFile(string InputPathOfZipFile,string directoryName)
{
     bool ret = true;
     try
     {
         if (File.Exists(InputPathOfZipFile))
         {     
          using (ZipInputStream ZipStream = new ZipInputStream(File.OpenRead(InputPathOfZipFile)))
          { 
              ZipEntry theEntry;
              while ((theEntry = ZipStream.GetNextEntry()) != null)
              {
                  if (theEntry.IsFile)
                  {
                       if (theEntry.Name != "")
                       {
                           string currentFileName=theEntry.Name .Substring(directoryName.Length+1);
                           using (FileStream streamWriter = File.Create(Server.MapPath("Customer\\ImageStorage\\" + currentFileName)))
                            {
                                 int size = 2048;
                                 byte[] data = new byte[2048];
                                 while (true)
                                 {
                                     size = ZipStream.Read(data, 0, data.Length);
                                     if (size > 0)
                                         streamWriter.Write(data, 0, size);
                                     else
                                         break;
                                      }
                                      streamWriter.Close();
                                  }
                             }
                        }   
                  }
                  ZipStream.Close();
              }
          }
       }
    catch (Exception ex)
    {
          ret = false;
    }
     return ret;
}  

1 użytkowników online, w tym zalogowanych: 0, gości: 1