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

scoubidou944 728 Messages postés mardi 22 avril 2003Date d'inscription 19 janvier 2017 Dernière intervention - 5 août 2004 à 18:14 - Dernière réponse : scoubidou944 728 Messages postés mardi 22 avril 2003Date d'inscription 19 janvier 2017 Dernière intervention
- 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 

11 réponses

Répondre au sujet
scoubidou944 728 Messages postés mardi 22 avril 2003Date d'inscription 19 janvier 2017 Dernière intervention - 6 août 2004 à 13:10
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de scoubidou944
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 5 août 2004 à 19:26
0
Utile
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
scoubidou944 728 Messages postés mardi 22 avril 2003Date d'inscription 19 janvier 2017 Dernière intervention - 5 août 2004 à 19:51
0
Utile
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
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 5 août 2004 à 21:08
0
Utile
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
scoubidou944 728 Messages postés mardi 22 avril 2003Date d'inscription 19 janvier 2017 Dernière intervention - 5 août 2004 à 23:54
0
Utile
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
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 6 août 2004 à 07:46
0
Utile
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
scoubidou944 728 Messages postés mardi 22 avril 2003Date d'inscription 19 janvier 2017 Dernière intervention - 6 août 2004 à 12:43
0
Utile
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
scoubidou944 728 Messages postés mardi 22 avril 2003Date d'inscription 19 janvier 2017 Dernière intervention - 6 août 2004 à 12:51
0
Utile
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
scoubidou944 728 Messages postés mardi 22 avril 2003Date d'inscription 19 janvier 2017 Dernière intervention - 6 août 2004 à 13:21
0
Utile
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
tarbidi 1 Messages postés vendredi 24 septembre 2004Date d'inscription 19 janvier 2006 Dernière intervention - 19 janv. 2006 à 09:32
0
Utile
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
scoubidou944 728 Messages postés mardi 22 avril 2003Date d'inscription 19 janvier 2017 Dernière intervention - 19 janv. 2006 à 11:07
0
Utile
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.