[C#] Téléchargement de fichier [Résolu]

Messages postés
728
Date d'inscription
mardi 22 avril 2003
Dernière intervention
19 janvier 2017
- - Dernière réponse : scoubidou944
Messages postés
728
Date d'inscription
mardi 22 avril 2003
Dernière intervention
19 janvier 2017
- 19 janv. 2006 à 11:07
Autant le téléchargement d'un fichier est bête comme choux :
System.Net.WebClient client = new WebClient();
client.DownloadFile ("http://www.MonURL.com/Dossier/fichier", @".c:\Monfichier.txt");

autant si on veut vérifier la date avant de mettre à jour le même fichier ou bien authentifier l'utilisateur, la G aucune ID de comment procéder.
Surtout que le serveur web est partagé et qu'il tourne sur Apache/Unix probablement donc pas possible d'avoir un soft .NET qui tourne derrière.

Une id ?

----------------------------
C++ forever
C# amateur
Afficher la suite 

Votre réponse

11 réponses

Meilleure réponse
Messages postés
728
Date d'inscription
mardi 22 avril 2003
Dernière intervention
19 janvier 2017
3
Merci
Bon j'ai trouvé son erreur, ca vient du fait qu'il lit toujours la taille maxi du buffer sans s'occuper du fait qu'en fin de buffer, il y a moins d'octets, j'ai renommé tt ca en un peu plus propre et ca donne :

private void button1_Click(object sender, System.EventArgs e)
{
MemoryStream MemoryStreamImage = new MemoryStream();
try
{
string szURL = "http://www.google.fr/intl/fr_fr/images/logo.gif";
progressBar1.Visible = true;
progressBar1.Minimum = 1;
progressBar1.Value = 1;
progressBar1.Step = 1024;

WebRequest myWebRequest = WebRequest.Create(szURL);
WebResponse myWebResponse = myWebRequest.GetResponse();
progressBar1.Maximum = Convert.ToInt32(myWebResponse.ContentLength);
Stream oReceiveStream = myWebResponse.GetResponseStream();

// Init & read first block
int iTotalBytesRead = 0;
int iCount = 64;
byte []abBuffer = new byte [iCount];
iCount = oReceiveStream.Read (abBuffer, 0, iCount);

// Loop until data are remaining
while (iCount > 0)
{
MemoryStreamImage.Write (abBuffer, 0, iCount);
iCount = oReceiveStream.Read (abBuffer, 0, iCount);
iTotalBytesRead += iCount;
progressBar1.PerformStep();
}

// Create bitmap
pictureBox1.Image = new Bitmap(MemoryStreamImage);

// Release all
MemoryStreamImage.Close();
oReceiveStream.Close();
myWebResponse.Close();
}
catch (Exception _e)
{
return;
}
}
----------------------------
C++ forever
C# amateur

Merci scoubidou944 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de scoubidou944
Messages postés
6366
Date d'inscription
samedi 1 juin 2002
Dernière intervention
2 août 2014
0
Merci
HttpWebRequest webReq = (HttpWebRequest)HttpWebRequest.Create(uri_fichier);
HttpWebResponse webResp = (HttpWebResponse)webReq.GetResponse();

et tu as ta date dans webResp.LastModified nomalement

Cocoricoooooooo !!!!
Commenter la réponse de cs_coq
Messages postés
728
Date d'inscription
mardi 22 avril 2003
Dernière intervention
19 janvier 2017
0
Merci
trop fort ;p

webResp.LastModified contient bien la date complete
webResp.ContentLength contient lui la taille du fichier.

Si le fichier n'existe pas, bien entendu on chope une Exception.

Allez on complique parce que là, ce n'est pas te faire honneur de poser des questions aussi simples ;p

Maintenant qu'on a tout ce qu'il faut pour identifier un fichier à mettre à jour :
- comment logger les personnes qui ont fait la requete car System.Net.WebClient.UploadValues() forcément renvoit une erreur (ce qui est normal sinon n'impore qui pourrait envoyer D données dans un dossier d'un site web).
- ensuite comment valider à partir d'un username/password/Date d'expiration avant le téléchargement ? Parce que pour mon K, je n'ai qu'un compte FTP admin pour tt le site sinon CT trop simple ;p

Merci encore à notre coq national tjs présent :)

++
----------------------------
C++ forever
C# amateur
Commenter la réponse de scoubidou944
Messages postés
6366
Date d'inscription
samedi 1 juin 2002
Dernière intervention
2 août 2014
0
Merci
eh bah là ça depasse mes connaissances
pour la date je savais mais pour le reste aucune idée lol

Cocoricoooooooo !!!!
Commenter la réponse de cs_coq
Messages postés
728
Date d'inscription
mardi 22 avril 2003
Dernière intervention
19 janvier 2017
0
Merci
Comment toi ? tu seches ?
Ma quete serait donc t elle peine perdue ? lol
En y pensant, je me disais qu'il faudrait interface avec SQL, creer une BDD sur le site qui contient les logins/password et expiration date et interroger directement à partir de C# la BDD.
MAintenant V fouiner les samples ;p

----------------------------
C++ forever
C# amateur
Commenter la réponse de scoubidou944
Messages postés
6366
Date d'inscription
samedi 1 juin 2002
Dernière intervention
2 août 2014
0
Merci
mais non ce n'est pas perdu lol
y'en a d'autres qui pourront surement t'aider

Cocoricoooooooo !!!!
Commenter la réponse de cs_coq
Messages postés
728
Date d'inscription
mardi 22 avril 2003
Dernière intervention
19 janvier 2017
0
Merci
Voici le code pour le download d'un fichier
public void UpdateFile (string _szURLWithFilename, string _szFullLocalPathAndFilename)
{
HttpWebRequest webReq = null;
HttpWebResponse webResp = null;
System.Net.WebClient client = null;

if (File.Exists (_szFullLocalPathAndFilename))
{
// Get date & size
try
{
// Init request
webReq = (HttpWebRequest)HttpWebRequest.Create(_szURLWithFilename);

// Set the 'Timeout' property in Milliseconds.
webReq.Timeout=10000;

// Get response
webResp = (HttpWebResponse)webReq.GetResponse();
}
catch (Exception e)
{
// File doesn't exist
return ;
}

// Check date
//DateTime oLocalFileTime = File.GetCreationTime (_szFullLocalPathAndFilename);
DateTime oLocalFileWriteTime = File.GetLastWriteTime(_szFullLocalPathAndFilename);
if (oLocalFileWriteTime < webResp.LastModified)
{
// Remote file is more recent, new file size is webResp.ContentLength
}
else if (oLocalFileWriteTime == webResp.LastModified)
{
// Just chek size to be sure
FileInfo fi = new FileInfo(_szFullLocalPathAndFilename);
if (webResp.ContentLength == fi.Length)
{
// Same file size, 99% sure it's the same file (no need to download fiel and compare both MD5 ;p)
return ;
}
}
else
{
// Local file is more recent or up to date
// Nothing to do
return;
}
}

// No date to check, simply upload file
try
{
client = new WebClient();
client.DownloadFile (_szURLWithFilename, _szFullLocalPathAndFilename);
}
catch (Exception e)
{
// File doesn't exist
MessageBox.Show (e.ToString (), "Attention", MessageBoxButtons.OK, MessageBoxIcon.Error);
return ;
}

// Done
}

Si notre amis le coq ou les autres ont D commentaires à faire sur le code je suis preneur surtout que dans la pose des TRy/catch, je ne suis pas sûr que ce soit fait proprement.

et pour terminer, preuve que j'ai cherché sur le forum avant de poster, un très bon exemple quant il ne plante pas;p de download avec progress bar :
http://www.csharpfr.com/codes/PROGRESSBAR_SUR_TELECHARGEMENT_DE_FICHIER/22744.aspx

J'ai juste changé dans button1_Click()
string szURL = "http://www.google.fr/intl/fr_fr/images/logo.gif";
WebRequest myWebRequest = WebRequest.Create(szURL);

histoire d'avoir une image qui ne risque pas de changer trop rapidement ;p

++
----------------------------
C++ forever
C# amateur
Commenter la réponse de scoubidou944
Messages postés
728
Date d'inscription
mardi 22 avril 2003
Dernière intervention
19 janvier 2017
0
Merci
Par contre sur l'exemple cité de download avec progress bar, il semblerait qu'on choppe une exception parfois 'Paramètre non valide utilisé'
et visiblement selon les cas, il n'affiche pas l'image ou incomplete, il doit manquer qql chose je pense pour synchroniser tt ca

----------------------------
C++ forever
C# amateur
Commenter la réponse de scoubidou944
Messages postés
728
Date d'inscription
mardi 22 avril 2003
Dernière intervention
19 janvier 2017
0
Merci
small eratum :
iCount = oReceiveStream.Read (abBuffer, 0, abBuffer.Length);

et non
iCount = oReceiveStream.Read (abBuffer, 0, iCount);

Les 2 cas marchent, c juste que dans le K précédent, lorsk le compte de 'bytes' diminue ca fait diminuer la zone de stokage.
----------------------------
C++ forever
C# amateur
Commenter la réponse de scoubidou944
Messages postés
1
Date d'inscription
vendredi 24 septembre 2004
Dernière intervention
19 janvier 2006
0
Merci
salut

je veux coder en c# une communication qui se base sur https.

j'ai parametré mon site afin de travailler en https.

maintenant que tout est fait je n'arrive pas a trouver la bonne référence en c# pour communiquer en https.

comme je bascule de Java à c# je suis un peu perdu.

si qcq 1 à une piste je suis intéressé

Sauve qui peut.
Commenter la réponse de tarbidi
Messages postés
728
Date d'inscription
mardi 22 avril 2003
Dernière intervention
19 janvier 2017
0
Merci
Google : C# HTTPS, premier lien rohhh il a même pô cherché :

http://defaut.developpez.com/tutoriel/dotnet/webservices/https/cs/

----------------------------
C++ forever
C# amateur
Commenter la réponse de scoubidou944

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.