J'en ai profité pour améliorer le code depuis mais l'ai quand même laissé dans un seul fichier:
Fichier envoieFichier.php présent à la racine du serveur:
<?php
// Testons si le fichier a bien été envoyé et s'il n'y a pas d'erreur
if (isset($_FILES['monfichier']) AND $_FILES['monfichier']['error'] == 0)
{
// Testons si le fichier n'est pas trop gros
if ($_FILES['monfichier']['size'] <= 8000000) // 8 MO
{
// Testons si l'extension est autorisée
$infosfichier = pathinfo($_FILES['monfichier']['name']);
$extension_upload = $infosfichier['extension'];
$extensions_autorisees = array('jpg', 'jpeg', 'gif', 'png'); // A vous de choisir quels extensions vous acceptez
if (in_array($extension_upload, $extensions_autorisees))
{
// On peut valider le fichier et le stocker définitivement
move_uploaded_file($_FILES['monfichier']['tmp_name'], 'uploads/' . basename($_FILES['monfichier']['name']));
echo "L'envoi a bien ete effectue !
";
}
}
else
{
echo "Fichier trop grand";
}
}
?>
/*
Code par Dardanboy (www.dardanboy.eu)
Créé/édité le 19 mars 2013
Copyright: CC-BY-NC-SA (http://creativecommons.org/licenses/by-nc-sa/3.0/)
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <windows.h>
#define VOTRE_SITE "www.dardanboy.eu"
#define IP_SITE "91.121.101.139" // xxx.xxx.xxx.xxx Allez dans cmd.exe (pour Windows) puis tapez: ping + VOTRE_SITE et mettez ici l'adresse qui apparait
#define NOM_PAGE_UPLOAD "envoiFichier.php" // Le nom vers la page qui contient le code php. Ici envoiFichier.php est situé à la racine du site (soit dans le "dossier": / )
void ouvertureFichier(char chemin[], int *taille, char **contenuFichier);
int tailleFichier(FILE *fichier);
void retirerNomFichier(char chemin[], char partieEnlevee[]);
void enleverPartie(char chemin[], char delimiteur, char partieEnlevee[]);
void differenceChaines(char chaine1[], char chaine2[], char resultat[]);
void retirerExtension(char chaine[], char partieEnlevee[]);
void preparationRequete(char nomFichier[], char extensionFichier[], char *contenuFichier, int tailleFichier);
void affecterTypeMime(char extension[], char typeMime[]);
void envoyerImage(char *requeteComplete, int tailleTotale);
int recupererNomOrdinateur(char userName[]);
int main(void)
{
int entree 0, tailleFichier 0;
char cheminVersImage[256], partieEnlevee[256], extension[4], nomFichier[256], *contenuFichier = NULL, nomOrdinateur[256];
printf("## Uploadeur d'images par Dardanboy (www.dardanboy.eu) ##\n\n");
do
{
printf("Bienvenue dans le menu, que voulez-vous faire ?\n"
"1. Entrer le chemin de l'image' et l'envoyer\n"
"2. Aide\n"
"3. Quitter le logiciel\n");
scanf("%d", &entree);
switch(entree)
{
case 1:
printf("Entrez le chemin vers l'image\n");
scanf("%s", cheminVersImage);
// On ouvre le fichier et on stoque toutes les donnàes dans contenuFichier
ouvertureFichier(cheminVersImage, &tailleFichier, &contenuFichier);
// On retire le nom du fichier (xyz.png, xyz.jpg, xyz.gif..) et on place ça dans partieEnlevee
retirerNomFichier(cheminVersImage, partieEnlevee);
// On copie dans nomFichier la partie enlevée par la fonction retirerNomFichier()
strcpy(nomFichier, partieEnlevee);
// On retire l'extension du fichier précédent (png, jpg, gif...) et on place ça dans partieEnlevee
retirerExtension(partieEnlevee, partieEnlevee);
// On copie dans extension la partie enlevée par la fonction retirerExtension()
strcpy(extension, partieEnlevee);
preparationRequete(nomFichier, extension, contenuFichier, tailleFichier);
// /\IMPORTANT/\ On libère la mémoire allouée dynamiquement pour contenuFichier
free(contenuFichier);
break;
case 2:
printf("Pour uploader une image, entrez le lien absolu vers celle-ci ou glissez-deposez la sur le logiciel pour que le lien apparaisse\n");
if(recupererNomOrdinateur(nomOrdinateur))
{
printf("Lien absolu vers votre dossier "Image":\n\tC:\\Users\\%s\\Pictures\\\n", nomOrdinateur);
}
break;
case 3:
return 0;
break;
default:
printf("Erreur, aucune correspondance\n");
break;
}
printf("\n\n");
}while(1);
return 0;
}
void ouvertureFichier(char chemin[], int *taille, char **contenuFichier)
{
int result = 0;
FILE *fichier = fopen(chemin, "rb"); // Le mode rb veut dire read binary
if(fichier != NULL)
{
*taille = tailleFichier(fichier);
rewind(fichier); // On replace le "curseur" au début du fichier
// On alloue un espace suffisant pour l'image grace à l'allocation dynamique
*contenuFichier = (char*) malloc((*taille) * sizeof(char));
if(contenuFichier == NULL)
{
perror("Allocation dynamique impossible\n");
exit(1);
}
result = fread(*contenuFichier, 1, *taille, fichier);
if(result != *taille)
{
fputs("Erreur lors de la lecture", stderr);
exit(2);
}
fclose(fichier);
}
else
{
if(errno == ENOENT) // The named file does not exist, and O_CREAT is not specified.
{
printf("Le fichier n'existe pas ou le chemin donné n'est pas correct\n");
}
else
{
printf("Erreur inconnue n° %d\n", errno);
exit(3);
}
}
}
int tailleFichier(FILE *fichier)
{
// On calcule la taille de l'image
fseek(fichier, 0 ,SEEK_END);
return ftell(fichier);
}
void retirerNomFichier(char chemin[], char partieEnlevee[])
{
if(strstr(chemin, "\"))
{
enleverPartie(chemin, '\\', partieEnlevee);
}
else
{
printf("Erreur, le chemin de l'image ne semble pas etre bon\n");
}
}
void retirerExtension(char chaine[], char partieEnlevee[])
{
if(strstr(chaine, "."))
{
enleverPartie(chaine, '.', partieEnlevee);
}
else
{
printf("Erreur, la chaine donnee ne semble pas contenir d'extension (avec un point)\n");
}
}
void enleverPartie(char chemin[], char delimiteur, char partieEnlevee[])
{
int i 0, j 0, k = 0;
char cheminCopie[256];
strcpy(cheminCopie, chemin);
for(i = strlen(chemin); chemin[i-1] != delimiteur; i --){}
for(j = 0; j < i; j ++, k ++)
{
chemin[j] = chemin[k];
}
chemin[j] = '\0'; // On ferme la chaine avec le caractère de fin de chaine \0 ou 0 (c'est la même chose)
differenceChaines(chemin, cheminCopie, partieEnlevee);
}
void differenceChaines(char chaine1[], char chaine2[], char resultat[])
{
int i 0, j 0;
// Tant que les chaines se ressemblent
for(; chaine1[i] == chaine2[i]; i ++){}
// On prend le "bout" qui reste en laissant i à sa valeure précédente
for(; chaine2[i] != '\0'; i ++, j ++)
{
resultat[j] = chaine2[i];
}
resultat[j] = '\0';
}
void preparationRequete(char nomFichier[], char extensionFichier[], char *contenuFichier, int tailleFichier)
{
char mimeType[12], hautRequete[1024], milieuRequete[512], *requeteFinale = NULL;
int taillebasRequete = 0;
char basRequete[] =
"\r\n"
"----Upload_Image--\r\n";
taillebasRequete = strlen(basRequete);
affecterTypeMime(extensionFichier, mimeType);
sprintf(milieuRequete,
"----Upload_Image\r\n"
"Content-Disposition: form-data; name="monfichier"; filename="%s"\r\n"
"Content-Type: %s\r\n"
"\r\n", nomFichier, mimeType);
sprintf(hautRequete,
"POST /%s HTTP/1.1\r\n"
"Accept: text/html, application/xhtml+xml, */*\r\n"
"Accept-Language: fr-CH\r\n"
"User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)\r\n"
"Content-Type: multipart/form-data; boundary=--Upload_Image\r\n"
"Host: %s\r\n"
"Content-Length: %d\r\n"
"Connection: close\r\n"
"Cache-Control: no-cache\r\n"
"\r\n", NOM_PAGE_UPLOAD, VOTRE_SITE, strlen(milieuRequete) + taillebasRequete + tailleFichier);
requeteFinale = (char*) malloc( (sizeof(char) * strlen(hautRequete) + (sizeof(char) * strlen(milieuRequete)) + (sizeof(char) * tailleFichier) + (sizeof(char) * taillebasRequete) ));
if(requeteFinale == NULL)
{
perror("Allocation dynamique impossible\n");
exit(1);
}
int taille = sprintf(requeteFinale, hautRequete);
taille += sprintf(requeteFinale + strlen(hautRequete), milieuRequete);
memcpy(requeteFinale + taille, contenuFichier, tailleFichier);
taille += sprintf(requeteFinale + taille + tailleFichier, basRequete);
envoyerImage(requeteFinale, taille + tailleFichier);
free(requeteFinale);
}
void envoyerImage(char *requeteComplete, int tailleTotale)
{
char reponseServ[512] = "";
#if __WIN32
WSADATA WSAData;
int erreur = WSAStartup(MAKEWORD(2,2), &WSAData);
#else
int erreur = 0;
#endif
if(!erreur)
{
SOCKET sock;
SOCKADDR_IN sin;
// On configure la connexion au serveur au port 80 (http) et l'adresse du serveur
sock = socket(AF_INET, SOCK_STREAM, 0);
/* Configuration de la connexion */
sin.sin_addr.s_addr = inet_addr(IP_SITE);
sin.sin_family = AF_INET;
sin.sin_port = htons(80);
// On essaie de se connecter grâce à connect
if(connect(sock, (SOCKADDR*)&sin, sizeof(sin)) != SOCKET_ERROR)
{
// On essaie d'envoyer notre requête
if(send(sock, requeteComplete, tailleTotale, 0) != SOCKET_ERROR)
{
printf("\nReponse du serveur: \n");
// On fait une boucle tant qu'on reçoit une réponse du serveur.
while(recv(sock, reponseServ, 512, 0))
{
printf("%s\n", reponseServ);
}
printf("\n\n");
}
else
{
perror("Erreur avec send()");
system("PAUSE");
}
// On ferme tout ce qu'on a ouvert
closesocket(sock);
#if __WIN32
WSACleanup();
#endif
}
else
{
perror("Erreur avec connect, impossible de se connecter\n");
closesocket(sock);
#if __WIN32
WSACleanup();
system("PAUSE");
#endif
}
}
}
void affecterTypeMime(char extension[], char typeMime[])
{
if(strcmp(extension, "jpg") 0 || strcmp(extension, "jpeg") 0 || strcmp(extension, "jpe") == 0)
{
strcpy(typeMime, "image/jpeg");
}
else if(strcmp(extension, "gif") == 0)
{
strcpy(typeMime, "image/gif");
}
else if(strcmp(extension, "png") == 0)
{
strcpy(typeMime, "image/x-png");
}
else if(strcmp(extension, "svg") == 0)
{
strcpy(typeMime, "image/svg+xml"); // Défini dans http://www.w3.org/TR/SVGTiny12/mimereg.html
}
}
int recupererNomOrdinateur(char userName[])
{
DWORD dwBufLength = 256;
if(GetUserNameA(userName, &dwBufLength)){
return 1;
}
else{
return -1;
}
}