Hello, I have an Arduino mega + shield w5100 sketch running a beehive monitoring program.
I have currently implemented a server function which allows me to download from my pc (mega ip address) the files located on the micro SD of the Ethernet shield.
I am not the one who designed this program (thanks to the many examples) I am new to programming ...
I would like to find some help (tutorial or others ...) to add to this function of downloading files from the SD to the PC the option of remotely deleting files (in addition to being able to download them).
Has anyone seen an example of this or could help me design it?
Thank you
PS: I am attaching the code for the file download server part.
/ * File listing function * /
void ListFiles(EthernetClient client, uint8_t flags, File dir) {
client.println("<ul>");
while (true) {
File entry = dir.openNextFile();
// here is what we do if there is no more entry in the directory
if (! entry) {
// No more file
break; // we exit the while
}
// print all the indent spaces
client.print("<li><a href=\"");
client.print(entry.name());
if (entry.isDirectory()) {
client.println("/");
}
client.print("\">");
// print the name of the file with a possible filling of empty spaces
client.print(entry.name());
if (entry.isDirectory()) {
client.println("/");
}
client.print("</a>");
client.println("</li>");
entry.close();
} // end of while
client.println("</ul>");
} // end of the function lists the files
// How big should our row buffer be. 100 is already a lot!
//#define BUFSIZ 100
/ * Function of creation of the listing of the files present on the SD * /
void printDirectory(File dir, int numTabs) {
while(true) {
File entry = dir.openNextFile();
if (! entry) {
// No more file
break;
}
for (uint8_t i=0; i<numTabs; i++) {
Serial.print('\t');
}
Serial.print(entry.name());
if (entry.isDirectory()) {
Serial.println("/");
printDirectory(entry, numTabs+1);
} else {
// files have sizes, directories don't have
Serial.print("\t\t");
Serial.println(entry.size(), DEC);
}
entry.close();
}
} //end of printDirectory
/ * Remote access function SD files on Arduino (web server) * /
void afficheserveur(){ // display web page
char clientline[BUFSIZ];
char name[17];
int index = 0;
EthernetClient client = server.available();
if (client) {
root = SD.open("/");
printDirectory(root, 0); // go to the function for creating the listing of the files present on the SD
// initialization with one end of the HTTP request with an empty line
boolean current_line_is_blank = true;
// reset the input buffer
index = 0;
while (client.connected()) {
if (client.available()) {
char c = client.read();
// If it is not a new line, add the character to the buffer
if (c != '\n' && c != '\r') { // get a \ n or \ r newline, means the string is complete
clientline[index] = c;
index++;
// Are we too big for the buffer? If this is the case we start to throw away data
if (index >= BUFSIZ)
index = BUFSIZ -1;
// we keep reading more data!
continue;
} // end of if
// get a \ n or \ r newline, means the string is complete
clientline[index] = 0;
// Display for debugging
Serial.println(clientline);
// Find a substring such as a request to get the file
if (strstr(clientline, "GET /") != 0)
{
// this time no space after the /, so a subfile!
char *filename;
filename = clientline + 5; // a little trick, look after the "GET /" (5 characters) *******
// find the string "HTTP / 1.1" and change the first character of the substring to a 0 to clear it.
(strstr(clientline, " HTTP"))[0] = 0;
if(filename[strlen(filename)-1] == '/') { // Split the name of the directory file
filename[strlen(filename)-1] = 0; // because the opening generates an error if we leave the character / at the end
} // end of if filename
Serial.print(F("Web query for : "));
Serial.println(filename); // Display the name of the requested file
File file = SD.open(filename, O_READ);
if ( file == 0 ) { // Opening the file with the return code of 0 is an error in SDFile.open
client.println("HTTP/1.1 404 Not Found");
client.println("Content-Type: text/html");
client.println();
client.println("<h2>File Not Found!</h2>");
client.println("
<h3>Couldn't open the File!</h3>");
break;
} // end of if file open error
Serial.println("File open!");
client.println("HTTP/1.1 200 OK");
if (file.isDirectory()) {
Serial.println(F("It's a directory"));
//file.close();
client.println("Content-Type: text/html");
client.println();
client.print("<h2>Fichiers dans /");
client.print(filename);
client.println(":</h2>");
ListFiles(client,LS_SIZE,file);
file.close();
}
else { // Any non-directory clicked, the server will send the file to the client for download
client.println("Content-Type: application/octet-stream");
client.println();
char file_buffer[16];
int avail;
while (avail = file.available()) {
int to_read = min(avail, 16);
if (to_read != file.read(file_buffer, to_read)) {
break;
}
// uncomment the Serial.write to debug (it's slow!)
//Serial.write((char)c);
client.write(file_buffer, to_read);
}// end of while dispo
file.close();
} // end of else
} // end of strstr clientline
else {
// Any error is a 404 error
client.println("HTTP/1.1 404 Not Found");
client.println("Content-Type: text/html");
client.println();
client.println("<h2>File Not Found!</h2>");
} //end of else
break;
} // end of if client available
} //end of u while connected
// give the web browser time to receive the data
delay(100);
client.stop();
} // end of if client
} // end of the Arduino web server function