Transférer fichier jpg sur carte SD Ethernet Shield vers page Web

Bonjour à tous,

Je travaille actuellement sur un projet type Netatmo, qui me permet de surveiller à distance mon appartement à partir de quelques données : température, humidité, niveau sonore, qualité de l'air, capture d'image, détection de mouvement à venir.

J'ai connecté tous mes capteurs à une carte Uno (pas idéal mais ça fait le job pour le moment) et j'utilise un shield Ethernet Arduino, avec un stockage sur carte SD. Les images sont prises avec une camera Linksprite JPEG TTL infrarouge et l'écriture du fichier correspondant sur carte SD se passe bien.

J'aimerais maintenant réussir à envoyer les données du fichier JPG (au moment de la capture ou en lisant le fichier créé sur SD) à ma page Web distante, comme le reste de mes données. Sauf que je suis un peu perdu dans les types (char, byte, string...) et dans la manière de procéder...
J'ai étudié l'option Web server (Ethernet server) mais je préfère que les images capturées soient envoyées à distance, plutôt que de venir les lire directement sur la carte, pour des questions de sécurité.

Comment dois-je faire pour enregistrer les données de mon fichier JPG puis les inclure dans une variable que je passerai en "post" dans ma requête Web ?
A noter que j'ai des contraintes d'espace, parce que mon croquis flirte déjà avec les 100% d'espace de stockage disponible...

Voici mon code actuel. J'ai mis en commentaire la lecture du fichier JPG créé parce que je ne sais pas comment l'exploiter, et pour les tests je n'envoie que le contenu de ma variable "image" dans laquelle j'aimerais passer les données du fichier JPG à transmettre :

#include "DHT.h"
#define DHTPIN 8
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
#include <SoftwareSerial.h>
#include <SPI.h>
#include <SD.h>
#include <Ethernet.h>

byte ZERO = 0x00; 
byte incomingbyte;
SoftwareSerial mySerial(5,6); 
long int a=0x0000,j=0,k=0,count=0,i=0;
uint8_t MH,ML;
boolean EndFlag=0; 
File  myFile; 
void SendResetCmd();
void SetBaudRateCmd();
void SetImageSizeCmd();
void SendTakePhotoCmd();
void SendReadDataCmd();
void StopTakePhotoCmd();
int air = 0;
int seuil_air = 500;
int son = HIGH;
float hum;
float temp;
int interval = 5000;
char filename[] = "p000000.jpg";
int boucle = 0;
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Mon shield
char serveur[] = "www.monsite.com";
IPAddress ip(192,168,1,6);
EthernetClient client;
String data;
String image;

void setup() {
  Serial.begin(38400);  
  dht.begin();
  mySerial.begin(38400);
  pinMode(10, OUTPUT);
  SD.begin(4);
  if (Ethernet.begin(mac) == 0) { Ethernet.begin(mac, ip); }
}

void loop() {  
  boucle++;
  delay(interval);
  // AIR
  air = analogRead(0);
  // SON
  son = digitalRead(9);
  // HUMIDITE / TEMPERATURE
  //hum = dht.readHumidity();
  //temp = dht.readTemperature();
  //CAMERA
  byte a[32];
  int ii; 
  SendResetCmd();
  delay(4000);
  SendTakePhotoCmd(); 
  while(mySerial.available()>0){ incomingbyte=mySerial.read(); } 
  filename[6] = boucle+'0';
  myFile = SD.open(filename, FILE_WRITE); 
  while(!EndFlag){
    j=0;
    k=0;
    count=0;
    SendReadDataCmd(); 
    delay(20);
    while(mySerial.available()>0){
      incomingbyte=mySerial.read();
      k++;
      if((k>5)&&(j<32)&&(!EndFlag)){
        a[j]=incomingbyte;
        if((a[j-1]==0xFF)&&(a[j]==0xD9))
        EndFlag=1;
        j++;
        count++;
      }
    } 
    for(j=0;j<count;j++){
      if(a[j]<0x10){image += "0";}
      image += String(a[j],HEX) + " ";
        /*Serial.print("0");
        Serial.print(a[j],HEX);
        Serial.print(" ");*/
     } 
//Serial.println(image);     
    for(ii=0; ii<count; ii++)
    myFile.write(a[ii]); 
    Serial.println(); 
    i++; 
  } 
  myFile.close();
  /*File dataFile = SD.open("p000001.jpg");
  if (dataFile) {
    while (dataFile.available()) {
      Serial.write(dataFile.read());
    }
    dataFile.close();
  }*/
  EndFlag = 0;
  //for( int x = 0; x < sizeof(a);  ++x ){a[x] = (char)0;}
  // ETHERNET
  data = "auth=arduino_voltaire&temp=" + image;  
  if (client.connect(serveur,80)==1) {        
    Serial.print("POST : "); Serial.println(data);
    client.println("POST /monitoring/index.php HTTP/1.1"); 
    client.println("Host: www.monsite.com");
    client.println("Content-Type: application/x-www-form-urlencoded"); 
    client.print("Content-Length: "); 
    client.println(data.length()); 
    client.println(); 
    client.print(data); 
    client.println();
    client.stop();
  }
  while(1);
}

void SendResetCmd(){
  mySerial.write(0x56);
  mySerial.write(ZERO);
  mySerial.write(0x26);
  mySerial.write(ZERO);
}
 
void SetImageSizeCmd(){
  mySerial.write(0x56);
  mySerial.write(ZERO);
  mySerial.write(0x31);
  mySerial.write(0x05);
  mySerial.write(0x04);
  mySerial.write(0x01);
  mySerial.write(ZERO);
  mySerial.write(0x19);
  mySerial.write(0x11);
}
 
void SetBaudRateCmd(){
  mySerial.write(0x56);
  mySerial.write(ZERO);
  mySerial.write(0x24);
  mySerial.write(0x03);
  mySerial.write(0x01);
  mySerial.write(0x2A);
  mySerial.write(0xC8);
 
}
 
void SendTakePhotoCmd(){
  mySerial.write(0x56);
  mySerial.write(ZERO);
  mySerial.write(0x36);
  mySerial.write(0x01);
  mySerial.write(ZERO);
}
 
void SendReadDataCmd(){
  MH=a/0x100;
  ML=a%0x100;
  mySerial.write(0x56);
  mySerial.write(ZERO);
  mySerial.write(0x32);
  mySerial.write(0x0c);
  mySerial.write(ZERO);
  mySerial.write(0x0a);
  mySerial.write(ZERO);
  mySerial.write(ZERO);
  mySerial.write(MH);
  mySerial.write(ML);
  mySerial.write(ZERO);
  mySerial.write(ZERO);
  mySerial.write(ZERO);
  mySerial.write(0x20);
  mySerial.write(ZERO);
  mySerial.write(0x0a);
  a+=0x20;
}
 
void StopTakePhotoCmd(){
  mySerial.write(0x56);
  mySerial.write(ZERO);
  mySerial.write(0x36);
  mySerial.write(0x01);
  mySerial.write(0x03);
}