Ricerca FileServer funzionante per UNO + ethernet shield

Cerco un FileServer , FileManager (caricare/scaricare file nella SDCARD tramite LAN) pronto e funzionante per il compilatore 1.05, ho provato con quello di adafruit e altri ma niente, non funzionano
Grazie..

Non potevi essere più imperativo!! Datemi il software!! grazie!!! e sbrigatevi!!! :grin: :grin:

icio:
Cerco un FileServer , FileManager (caricare/scaricare file nella SDCARD tramite LAN) pronto e funzionante per il compilatore 1.05, ho provato con quello di adafruit e altri ma niente, non funzionano
Grazie..

Spendi qualche parola in più e spiegati meglio, non ti facciamo pagare le parole :slight_smile:
Magari quello che hai trovato non funziona e si può correggere, senza link sarà dura ... avevo fatto e pubblicato qualcosa di simile, mancavano solo le istruzioni per il download ... in realtà avevo fatto anche il download, mirato solo ad un file specifico.

Va bene... devo aggiungere / togliere file dal direttorio principale (root) nella SD card della scheda ethernet shield attraverso la LAN (ethernet) , il metodo non importa FTP - HTTP - comandi TELNET o altro che non immagino, basta che funzioni,
visto che è una applicazione standard se c'è qualcosa già pronto meglio, senza che lo debba scrivere di sana pianta, e visto che di applicazioni di rete sono piuttosto scarso non farei altro che scrivere qualcosa di brutto mettendoci un sacco di tempo.
Non occorre che abbia collegato altre cose , solo Arduino UNO e la ethernet shield.
E' ovvio che dopo dovrei modificarlo aggiungendoci la mia applicazione ma questa è un'altra storia......

non ho detto sbrigatevi..pablo! Se lo trovo bene , se non lo trovo pazienza, non ho nemmeno fretta..

mi spiego ancora meglio... ;D : upload o download files manualmente attraverso filezilla, un browser, o un qualsiasi programma terminale, non fà differenza...

ecco , ora mi pare che sia chiaro ... :smiley:

Dunque questo visualizza i file della SD con dei link su browser …
Se il browser riconosce l’estensione htm, css, gif ecc ecc te lo visualizza, se l’estensione è sconosciuta allora lo scarica es: pippo.ccc, altrimenti clicchi col tasto destro e da menu selezioni “salva destinazione” (su win)
Per fare il download su qualsiasi file devo implementare un pezzo che devo modificare …

Dimmi se ti funziona e cosa devo aggiungere soprattutto se è quello che cerchi
Su una UNO il prog non è proprio tanto leggero, taglia un po’ di serial.print se è il caso, magari anche la data e dimensione dei file se non serve, il controllo errori http 404, il controllo errori su SD … ecc

Ps: la SD deve essere superiore ai 2Gb … si può fare anche l’upload di file da remoto, ma su una UNO direi di lasciar stare

Pss: filezilla con ftp può essere un altra soluzione, ma non ho nulla di pronto

ciao

#include <SPI.h>
#include <SD.h>
#include <Ethernet.h>

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192, 168, 2, 177);
EthernetServer server(80);

Sd2Card card;
SdVolume volume;
SdFile root;
SdFile file;

void setup() {
  delay(1500);
  Serial.begin(57600);
  pinMode(10, OUTPUT);  digitalWrite(10, HIGH);                                      
  pinMode(4, OUTPUT); digitalWrite(4, HIGH);                       

  if (!card.init(SPI_HALF_SPEED, 4)) Serial.println(F("card.init failed!"));
  if (!volume.init(&card)) Serial.println(F("vol.init failed!"));
  if (!root.openRoot(&volume)) Serial.println(F("openRoot failed"));

  //Serial.println("Files found in root:");
  root.ls(LS_DATE | LS_SIZE);
  //Serial.println();
    
  //Serial.println("Files found in all dirs:");
  root.ls(LS_R);
 
  Ethernet.begin(mac, ip);
  server.begin();
}

#define BUFSIZ 100

void loop()
{
  char clientline[BUFSIZ];
  char *filename;
  byte index = 0;
  byte image = 0;
  
  EthernetClient client = server.available();
    
  if (client) {
    boolean current_line_is_blank = true;
    
    index = 0;
    
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        
        if (c != '\n' && c != '\r') {
          clientline[index] = c;
          index++;
          if (index >= BUFSIZ)
            index = BUFSIZ -1;       
          continue;
        }
        
        clientline[index] = 0;
        filename = 0;
        
        Serial.println(clientline);
        
        if (strstr(clientline, "GET / ") != 0) {
          client.println(F("HTTP/1.1 200 OK"));
          client.println(F("Content-Type: text/html"));
          client.println();
        
          client.println(F("<h2>Arduino SD list Files:</h2>"));
          ListFiles(client, LS_SIZE);
        }
  
 else if (strstr(clientline, "GET /") != 0) {
          
          if (!filename) filename = clientline + 5; 
          
          (strstr(clientline, " HTTP"))[0] = 0;
          
          Serial.println(filename);
          
          if (! file.open(&root, filename, O_READ)) {
            client.println(F("HTTP/1.1 404 Not Found"));
            client.println(F("Content-Type: text/html"));
            client.println();
            client.println(F("<h2>File Not Found!</h2>"));
            break;
          }
          
          //Serial.println("Open file");
          
          client.println(F("HTTP/1.1 200 OK"));
          if (strstr(filename, ".htm") != 0)
             client.println(F("Content-Type: text/html"));
         else if (strstr(filename, ".css") != 0)
             client.println(F("Content-Type: text/css"));
         else if (strstr(filename, ".png") != 0)
             client.println(F("Content-Type: image/png"));
          else if (strstr(filename, ".jpg") != 0)
             client.println(F("Content-Type: image/jpeg"));
         else if (strstr(filename, ".gif") != 0)
             client.println(F("Content-Type: image/gif"));
         else if (strstr(filename, ".3gp") != 0)
             client.println(F("Content-Type: video/mpeg"));
         else if (strstr(filename, ".pdf") != 0)
             client.println(F("Content-Type: application/pdf"));
         else if (strstr(filename, ".js") != 0)
             client.println(F("Content-Type: application/x-javascript"));
         else if (strstr(filename, ".xml") != 0)
             client.println(F("Content-Type: application/xml"));
         else
             client.println(F("Content-Type: text"));
             client.println();
          
          int16_t c;
          while ((c = file.read()) >= 0) {
              //Serial.print((char)c);
              client.print((char)c);
          }
          file.close();
        } else {
          client.println(F("HTTP/1.1 404 Not Found"));
          client.println(F("Content-Type: text/html"));
          client.println();
          client.println(F("<h2>File Not Found!</h2>"));
           }
        break;
      }
    }
    delay(1);
    client.stop();
  }
}

void ListFiles(EthernetClient client, uint8_t flags) {
  dir_t p;
  char str[3];
  root.rewind();
  client.println(F("<ul>"));
  while (root.readDir(p) > 0) {
    if (p.name[0] == DIR_NAME_FREE) break;
    if (p.name[0] == DIR_NAME_DELETED || p.name[0] == '.') continue;
    if (!DIR_IS_FILE_OR_SUBDIR(&p)) continue;
 
    client.print(F("<li><a href=\""));
    for (uint8_t i = 0; i < 11; i++) {
      if (p.name[i] == ' ') continue;
      if (i == 8) {
        client.print('.');
      }
      client.write(p.name[i]);
    }
    client.print(F("\">"));
 
    for (uint8_t i = 0; i < 11; i++) {
      if (p.name[i] == ' ') continue;
      if (i == 8) {
        client.print(F("."));
      }
      client.write(p.name[i]);
    }
 
    client.print(F("</a>"));
 
    if (DIR_IS_SUBDIR(&p)) {
      client.print(F("/"));
    }
 
       client.print(F("   data "));
       client.print(FAT_DAY(p.lastWriteDate));
       client.print(F("-"));
       client.print(FAT_MONTH(p.lastWriteDate));
       client.print(str);
       client.print(F("-"));
       client.print(FAT_YEAR(p.lastWriteDate));
       client.print(str);
       client.print(F("   time "));
       client.print(FAT_HOUR(p.lastWriteTime));
       client.print(str);
       client.print(F(":"));
       client.print(FAT_MINUTE(p.lastWriteTime));
       client.print(str);
       client.print(F(":"));
       client.print(FAT_SECOND(p.lastWriteTime));
       client.print(str);
          
    float Size =p.fileSize;
    if (!DIR_IS_SUBDIR(&p) && (flags & LS_SIZE)) {
      //client.print(' ');
      client.print(F("  SIZE : "));
     
     if (p.fileSize > 1048576){
       Size = Size/1048576;
       client.print(Size,3);
       client.print(F(" Mb")); 
      }
     
      else if (p.fileSize > 1024){
        Size = Size/1024;
        client.print(Size,3);
        client.print(F(" Kb")); 
      }
      else{
        client.print(p.fileSize);
        client.print(F(" b")); 
      }      
    }
    
    client.println(F("</li>"));
  }
  client.println(F("</ul>"));
}

E' all'incirca quello di cui ho bisogno, quando ci si collega all IP scarica un file html (ma senza estensione) che contiene tutti i file della root e delle directory, devo guardare meglio domani, adesso e tardi.. grazie

Tutti i file nella SD sono file testo ....
Sì , il programma prende troppo spazio...25k, domani vedo se lo capisco e ci risentiamo
.. :slight_smile:

Ho guardato Pablo, scremando le cose di cui parlavi e che non mi interessano sono arrivato a circa 20k , sarebbero ancora tantini visto che manca inoltre l'UPload dei file nella SDcard, non sò se fà al caso mio ma comunque è molto interessante

l’ho magrito ancora e adesso fa solo il download senza aprire i file, purtroppo è la lib SD.h che è impegnativa, bisognerebbe provare con la Sdfat questo mi da 20.4Kb

#include <SPI.h>
#include <SD.h>
#include <Ethernet.h>

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192, 168, 2, 177);
EthernetServer server(80);

Sd2Card card;
SdVolume volume;
SdFile root;
SdFile file;

void setup() {
  delay(1500);
  Serial.begin(57600);
  pinMode(10, OUTPUT);  digitalWrite(10, HIGH);                                      
  pinMode(4, OUTPUT); digitalWrite(4, HIGH);                       

  card.init(SPI_HALF_SPEED, 4);
  volume.init(&card); 
  root.openRoot(&volume); 
  root.ls(LS_DATE | LS_SIZE);
  root.ls(LS_R);
 
  Ethernet.begin(mac, ip);
  server.begin();
}

#define BUFSIZ 100

void loop(){
  char clientline[BUFSIZ];
  char *filename;
  byte index = 0;
  byte image = 0;
  
  EthernetClient client = server.available();
    
  if (client) {
    boolean current_line_is_blank = true;    
    index = 0;
    
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        
        if (c != '\n' && c != '\r') {
          clientline[index] = c;
          index++;
          if (index >= BUFSIZ)
            index = BUFSIZ -1;       
          continue;
        }
        
        clientline[index] = 0;
        filename = 0;
                
        if (strstr(clientline, "GET / ") != 0) {
          client.println(F("HTTP/1.1 200 OK"));
          client.println(F("Content-Type: text/html"));
          client.println();
               
          ListFiles(client, LS_SIZE);
        }
  
 else if (strstr(clientline, "GET /") != 0) {
          
          if (!filename) filename = clientline + 5;           
          (strstr(clientline, " HTTP"))[0] = 0;

          if (! file.open(&root, filename, O_READ)) break;    
          client.println(F("HTTP/1.1 200 OK"));
          client.println(F("Content-Type: application/octet-stream"));
          client.println();
               
          int16_t c;
          while ((c = file.read()) >= 0) {
              //Serial.print((char)c);
              client.print((char)c);
          }
          file.close();
        }        
        break;
      }
    }
    delay(1);
    client.stop();
  }
}

void ListFiles(EthernetClient client, uint8_t flags) {
  dir_t p;
  char str[3];
  root.rewind();
  client.println(F("<ul>"));
  while (root.readDir(p) > 0) {
    if (p.name[0] == DIR_NAME_FREE) break;
    if (p.name[0] == DIR_NAME_DELETED || p.name[0] == '.') continue;
    if (!DIR_IS_FILE_OR_SUBDIR(&p)) continue;
 
    client.print(F("<li><a href=\""));
    for (uint8_t i = 0; i < 11; i++) {
      if (p.name[i] == ' ') continue;
      if (i == 8) {
        client.print('.');
      }
      client.write(p.name[i]);
    }
    client.print(F("\">"));
 
    for (uint8_t i = 0; i < 11; i++) {
      if (p.name[i] == ' ') continue;
      if (i == 8) {
        client.print(F("."));
      }
      client.write(p.name[i]);
    }
 
    client.print(F("</a>"));
 
    if (DIR_IS_SUBDIR(&p)) {
      client.print(F("/"));
    }    
    client.println(F("</li>"));
  }
  client.println(F("</ul>"));
}

Niente ho provato anche con Sdfat, solo questo occupa +/- 16Kb e manca ancora la parte ethernetclient
Anche FTP con filezilla su porte 20/21 ha uno sketch e librerie troppo grandi per il 328 … ti resta pochissimo, mi spiace
Del resto l’ho sempre detto, un webserver per piccolo che sia “uccide” la UNO :slight_smile:

#include <SPI.h>
#include <SdFat.h>
#include <Ethernet.h>

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192, 168, 2, 177);
EthernetServer server(80);
SdFat sd;

void setup() {
  Serial.begin(57600);

  pinMode(4, OUTPUT);
  digitalWrite(4, 1);
  pinMode(10, OUTPUT);
  digitalWrite(10, 1);

  Ethernet.begin(mac, ip);
  server.begin();
  
  Serial.println(F("------sd root-------"));
  sd.ls();
  }

void loop() {}

L’ho modificato per essere più intuitivo, devo però ancora aggiungere il comando di upload dei file , l’ideale sarebbe poter trascinare il file su un qualcosa sulla pagina html e rilasciando il tasto del mouse il file viene trasferito, non mi vengono altre idee , l’ho detto che sono scarso in questo campo, occupa circa 20k

#include <SPI.h>
#include <SD.h>
#include <Ethernet.h>

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192, 168, 0, 177);
EthernetServer server(80);

Sd2Card card;
SdVolume volume;
SdFile root;
SdFile file;
#define BUFSIZ 100

//#############################################################################
void setup() {
  delay(200);
  Serial.begin(38400);
  pinMode(10, OUTPUT);  digitalWrite(10, HIGH);                                      
  pinMode(4, OUTPUT); digitalWrite(4, HIGH);                       

  if (!card.init(SPI_HALF_SPEED, 4)) Serial.println(F("card.init failed!"));
  if (!volume.init(&card)) Serial.println(F("vol.init failed!"));
  if (!root.openRoot(&volume)) Serial.println(F("openRoot failed"));
  
/*
  Serial.println("Files found in root:");
  root.ls(LS_DATE | LS_SIZE);
  Serial.println();
    
  Serial.println("Files found in all dirs:");
  root.ls(LS_R);
*/ 

  Ethernet.begin(mac, ip);
  server.begin();
}

//#############################################################################

//#define BUFSIZ 100

void loop()
{
  char clientline[BUFSIZ];
  char *filename;
  byte index = 0;
  byte image = 0;
  
  EthernetClient client = server.available();
    
  if (client) {
    //boolean current_line_is_blank = true;  //non usato
    
    index = 0;
    
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        
        if (c != '\n' && c != '\r') {
          clientline[index] = c;
          index++;
          if (index >= BUFSIZ)
            index = BUFSIZ -1;       
          continue;
        }
        
        clientline[index] = 0;
        filename = 0;
        
        //Serial.println(clientline);
        
        if (strstr(clientline, "GET / ") != 0) {        //comando di listing
          //client.println(F("  HTTP/1.1 200 OK"));
          //client.println(F("Content-Type: text/html"));
          client.println(F("   <html><head></head><body>"));   //invia pagina html con lista link files
          client.println();
          client.println(F("<h2>Remote SD List Files:</h2>"));
          ListFiles(client, LS_SIZE);
          client.println(F("</body></html>"));
          client.println();          
        }
  
 else if (strstr(clientline, "GET /") != 0) {
          
          if (!filename) {filename = clientline + 5;} //boh! comunque senza queste 2 linee dà  sempre file non Found
          (strstr(clientline, " HTTP"))[0] = 0;
          
          //Serial.println(filename);
          

            if (! file.open(&root, filename, O_READ)) {   //apertura file, errore se non esiste
              //client.println(F("HTTP/1.1 404 Not Found"));
              //client.println(F("Content-Type: text/html"));
              client.println();
              client.println(F("<h2>ERR1 File Not Found!</h2>"));
              break;
            }
          client.print(F(" "));  //bisogna metterlo altrimenti il primo carattere del file non cìè
          
          //Serial.println("Open file");
/*          
          client.println(F("HTTP/1.1 200 OK"));

          if (strstr(filename, ".htm") != 0)
             client.println(F("Content-Type: text/html"));
         else if (strstr(filename, ".css") != 0)
             client.println(F("Content-Type: text/css"));          
         else if (strstr(filename, ".png") != 0)
             client.println(F("Content-Type: image/png"));
          else if (strstr(filename, ".jpg") != 0)
             client.println(F("Content-Type: image/jpeg"));
         else if (strstr(filename, ".gif") != 0)
             client.println(F("Content-Type: image/gif"));
         else if (strstr(filename, ".3gp") != 0)
             client.println(F("Content-Type: video/mpeg"));
         else if (strstr(filename, ".pdf") != 0)
             client.println(F("Content-Type: application/pdf"));
         else if (strstr(filename, ".js") != 0)
             client.println(F("Content-Type: application/x-javascript"));
         else if (strstr(filename, ".xml") != 0)
             client.println(F("Content-Type: application/xml"));
             
         else
             client.println(F("Content-Type: text"));
             client.println();
*/  

          int16_t c;
            while ((c = file.read()) >= 0) {        //invia contenuto file
                //Serial.print((char)c);
                client.print((char)c);
            }
          file.close();
        } else {
          //client.println(F("HTTP/1.1 404 Not Found"));
          //client.println(F("Content-Type: text/html"));
          client.println();
          client.println(F("<h2>ERR2 File Not Found!</h2>"));
           }
        break;
      }  //end if (client.available())
    }  //end while (client.connected())
    delay(1);
    client.stop();
  }  //end if client
}  //end loop
//#############################################################################


void ListFiles(EthernetClient client, uint8_t flags) {
  dir_t p;
  char str[3];
  root.rewind();
  client.println(F("<ul>"));  //inizio lista non numerata
  while (root.readDir(p) > 0) {
    if (p.name[0] == DIR_NAME_FREE) break;
    if (p.name[0] == DIR_NAME_DELETED || p.name[0] == '.') continue;
    //if (!DIR_IS_FILE_OR_SUBDIR(&p)) continue;  //visualizza tutto
    if (DIR_IS_SUBDIR(&p)) continue;  //non visualizza le subdirectory
 
    client.print(F("<li><a href=\"")); //li = elemento lista  a href=link
    //client.print(ip);
    //client.print(F("/"));
      for (uint8_t i = 0; i < 11; i++) {
        if (p.name[i] == ' ') continue;
        if (i == 8) {client.print('.');}
        client.write(p.name[i]);
      }
    client.print(F("\">"));
     
      for (uint8_t i = 0; i < 11; i++) {
        if (p.name[i] == ' ') continue;
        if (i == 8) {client.print(F("."));}
        client.write(p.name[i]);
      }      
      
    client.print(F("</a>"));

//<ul><li><a href=\"filename.txt\">filename.txt</a></li></ul>

    if (DIR_IS_SUBDIR(&p)) {  //se è una subdir stampa /
      client.print(F("/"));
    }
/* 
       client.print(F("   data "));
       client.print(FAT_DAY(p.lastWriteDate));
       client.print(F("-"));
       client.print(FAT_MONTH(p.lastWriteDate));
       client.print(str);      
       client.print(F("-"));
       client.print(FAT_YEAR(p.lastWriteDate));
       client.print(str);
       client.print(F("   time "));
       client.print(FAT_HOUR(p.lastWriteTime));
       client.print(str);
       client.print(F(":"));
       client.print(FAT_MINUTE(p.lastWriteTime));   
       client.print(str);
       client.print(F(":"));           
       client.print(FAT_SECOND(p.lastWriteTime));
*/       
       //client.print(str);   //start download 
        
      //float Size = p.fileSize;  //non usato
       
    if (!DIR_IS_SUBDIR(&p) && (flags & LS_SIZE)) {  //se non è una subdir stampa il size
      //client.print(' ');
      client.print(F("  SIZE : "));
/*   
     if (p.fileSize > 1048576){
       Size = Size/1048576;
       client.print(Size,3);
       client.print(F(" Mb")); 
      }
     
      else if (p.fileSize > 1024){
        Size = Size/1024;
        client.print(Size,3);
        client.print(F(" Kb")); 
      }
      else{
*/
        client.print(p.fileSize);
        client.print(F(" bytes")); 
      //}      
    }  //end if (!DIR_IS_SUBDIR(&p) && (flags & LS_SIZE))
    
    client.println(F("</li>"));
  }  //end while
  client.println(F("</ul>"));
} //end ListFiles

//#############################################################################

L'ho modificato per essere più intuitivo

non hai letto il post 8, ho rispettato le specifiche di progettazione richieste dal committente :slight_smile: :slight_smile: occupa 16K

devo però ancora aggiungere il comando di upload dei file , l'ideale sarebbe poter trascinare il file su un qualcosa sulla pagina html e rilasciando il tasto del mouse il file viene trasferito

Potrebbe anche essere possibile, ma questo comporta script in java con richiamo di Api e librerie esterne, un lavoro troppo oneroso da caricare sulla flash del 328 .. sulla MEGA non ci sono problemi download/upload si fanno serenamente (entro certi limiti di dimensioni file)... l'ho fatto per molto tempo, sulla DUE ancora meglio i tempi si riducono di 10 volte.