Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Connaître la taille d'un fichier disponible au téléchargement sur internet

14 réponses
Avatar
Bonjour,

Avant de télécharger un fichier sur internet via du code, est-il possible de
connaître la taille de ce fichier ?

Merci d'avance pour votre aide,
Stéphane

10 réponses

1 2
Avatar
Jérémy Jeanson
Bonjour Stéphane,

Oui c'est possible... et on peut même te dire comment ;)

Dans le cas d'un téléchargement : donc du serveur vers le client
(navigateur), tu as la librairie System.IO qui contient la classe
FileInfo qui permet d'obtenir des information sur un fichier côté seveur.

Si tu veux faire l'opération dans l'autre sens : le client veut envoyer
un fichier ver ton serveur, tu peux utiliser le control FileUpload qui
affiche tout ce qu'il faut pour que l'utilisateur selectionne un fichier
présent sur son post et l'envoi au serveur. Ce control à une propriété
stockant les bits constituants le fichier donc si tu as un contrôle
nommé FileUpload1, tu peux connaitre la taille du fichier selectioné par
l'utilsiateur via le code suivant : Me.FileUpload1.FileBytes.Length.
Ceci avant même que le fichier soit remonté sur le serveur.
--
Jérémy JEANSON
MCP
http://www.jjeanson.fr
Avatar
Merci Jérémy,

Ah bin zut alors !
J'avais pourtant essayé IO.FileInfo(url) mais ca avait levé 1 exception.
Je vais reessayer.

A bientôt,
Stéphane.

PS :
Pour info, comme je n'avais pas été assez précis dans ma demande :
Je suis sur le client, et je télécharge 1 fichier sur 1 serveur sur
internet.

PS 2 :
Téléchargement ainsi :

Dim startup_path As String

Sub init()

startup_path = Application.StartupPath

If Not startup_path.EndsWith("") Then startup_path &= ""

End Sub

Sub télécharge(ByVal url As String)

Dim fichier As String = url.Substring(url.LastIndexOf("/") + 1)
Dim fichier_complet As String = startup_path & fichier
Dim CancelDownLoad As Boolean = False

If IO.File.Exists(fichier_complet) Then

Try
IO.File.Delete(fichier_complet)

Catch ex As Exception
'Droits insuffisants en écriture

End Try

End If

Try
My.Computer.Network.DownloadFile(url, fichier_complet, "", "",
True, 100000, True)

Catch ex As Exception

Select Case ex.Message

Case "L'opération a été annulée."
'L'opération a été annulée

Case Else
'Droits insuffisants en écriture ou disque plein ou...

End Select

CancelDownLoad = True

End Try

If Not CancelDownLoad Then

If IO.File.Exists(fichier_complet) Then
'Le téléchargement a réussi

Else
'Le téléchargement a échoué

End If

Else
'Le téléchargement a été annulé ou droits insuffisants en
écriture ou disque plein ou...

End If

End Sub


"Jérémy Jeanson" a écrit dans le message de news:
%
Bonjour Stéphane,

Oui c'est possible... et on peut même te dire comment ;)

Dans le cas d'un téléchargement : donc du serveur vers le client
(navigateur), tu as la librairie System.IO qui contient la classe FileInfo
qui permet d'obtenir des information sur un fichier côté seveur.

Si tu veux faire l'opération dans l'autre sens : le client veut envoyer un
fichier ver ton serveur, tu peux utiliser le control FileUpload qui
affiche tout ce qu'il faut pour que l'utilisateur selectionne un fichier
présent sur son post et l'envoi au serveur. Ce control à une propriété
stockant les bits constituants le fichier donc si tu as un contrôle nommé
FileUpload1, tu peux connaitre la taille du fichier selectioné par
l'utilsiateur via le code suivant : Me.FileUpload1.FileBytes.Length. Ceci
avant même que le fichier soit remonté sur le serveur.
--
Jérémy JEANSON
MCP
http://www.jjeanson.fr


Avatar
Jérémy Jeanson
Bonjour Stéphane,

Vu que tu dois faire le téléchargement à partir d'une application
maison, la donne n'est pas la même. Mais fort heureusement si tu ne veux
pas partir avec un code trop complexe, il existe My.

Je sais que j'ai l'habitude de ne pas le conseiller (migration vers C#
ou autre langage plus lourde car on doit tout réécrire). Mais dans ton
cas tu peux utiliser l'exemple suivant :

If My.Computer.Network.IsConnected Then
If My.Computer.Network.Ping("www.duncanmackenzie.net") Then
Debug.WriteLine("Site Available")

My.Computer.Network.DownloadFile( _
"http://www.duncanmackenzie.net/Articles/", _
My.Computer.FileSystem.SpecialFolders.MyDocuments, _
ShowProgress:=True)
End If
End If

Tiré de la page
http://msdn.microsoft.com/en-us/magazine/cc163972.aspx
--
Jérémy JEANSON
MCP
http://www.jjeanson.fr
Avatar
Fred
in news:, Stéphane wrote :

Bonjour,



Bonjour,

Avant de télécharger un fichier sur internet via du code, est-il
possible de connaître la taille de ce fichier ?



Je pense, sans l'avoir testé, qu'il faut faire une requête http avec la
méthode HEAD.
Ensuit tu regardes le champ content-length dans la réponse.

Tout ceci avec les classes System.Net.HttpWebRequest et
System.Net.WebResponse.


--
Fred

Avatar
Bonjour Jérémy,

Je n'ai pas de soucis avec le téléchargement.

Il fonctionne très bien, et justement avec la même méthode que tu viens de
signaler.

Je veux simplement connaiître la taille du fichier que je vais télécharger,
avant de le télécharger : ca me permettra ainsi de calculer au fur et à
mesure une estimation du temps restant pour le téléchargement.

Je n'ai pas encore réessayé ce que tu as dit avant. Je te tiens au courant.

Stéphane.


"Jérémy Jeanson" a écrit dans le message de news:

Bonjour Stéphane,

Vu que tu dois faire le téléchargement à partir d'une application maison,
la donne n'est pas la même. Mais fort heureusement si tu ne veux pas
partir avec un code trop complexe, il existe My.

Je sais que j'ai l'habitude de ne pas le conseiller (migration vers C# ou
autre langage plus lourde car on doit tout réécrire). Mais dans ton cas tu
peux utiliser l'exemple suivant :

If My.Computer.Network.IsConnected Then
If My.Computer.Network.Ping("www.duncanmackenzie.net") Then
Debug.WriteLine("Site Available")

My.Computer.Network.DownloadFile( _
"http://www.duncanmackenzie.net/Articles/", _
My.Computer.FileSystem.SpecialFolders.MyDocuments, _
ShowProgress:=True)
End If
End If

Tiré de la page
http://msdn.microsoft.com/en-us/magazine/cc163972.aspx
--
Jérémy JEANSON
MCP
http://www.jjeanson.fr


Avatar
Merci Fred,

Je vais aussi regarder de ce côté-ci.

Je te tiens au courant.

Stéphane.



"Fred" a écrit dans le message de news:

in news:, Stéphane wrote :

Bonjour,



Bonjour,

Avant de télécharger un fichier sur internet via du code, est-il
possible de connaître la taille de ce fichier ?



Je pense, sans l'avoir testé, qu'il faut faire une requête http avec la
méthode HEAD.
Ensuit tu regardes le champ content-length dans la réponse.

Tout ceci avec les classes System.Net.HttpWebRequest et
System.Net.WebResponse.


--
Fred



Avatar
Donc, j'ai testé la 1ère solution, mais elle ne fonctionne pas.

J'ai l'URL de mon fichier à télécharger :
fichier_à_télécharger

A noter que le téléchargement en lui-même fonctionne parfaitement.

Pour info :
IO.File.Exists(fichier_à_télécharger) retourne False

Et ceci lève 1 exception :
Dim fi As IO.FileInfo = New IO.FileInfo(fichier_à_télécharger)
Exception :
Les formats URI ne sont pas pris en charge.

Si je n'exécute pas ces lignes, j'arrive ici :
BackgroundWorker_Téléchargement.RunWorkerAsync(fichier_à_télécharger)

Private Sub BackgroundWorker_Téléchargement_DoWork(ByVal sender As
System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles
BackgroundWorker_Téléchargement.DoWork

téléchargement_ok = télécharge(e.Argument.ToString)

End Sub

Function télécharge(ByVal url As String) As Boolean

Dim fichier As String = url.Substring(url.LastIndexOf("/") + 1)
téléchargement_fichier_complet = Me.TextBox_Répertoire.Text &
fichier

My.Computer.Network.DownloadFile(url, téléchargement_fichier_complet, "",
"", True, 100000, True)

Et le téléchargement démarre normalement.


Je vais maintenant regarder les autres solutions proposées.

Stéphane.


<Stéphane> a écrit dans le message de news:

Bonjour Jérémy,

Je n'ai pas de soucis avec le téléchargement.

Il fonctionne très bien, et justement avec la même méthode que tu viens de
signaler.

Je veux simplement connaiître la taille du fichier que je vais
télécharger, avant de le télécharger : ca me permettra ainsi de calculer
au fur et à mesure une estimation du temps restant pour le téléchargement.

Je n'ai pas encore réessayé ce que tu as dit avant. Je te tiens au
courant.

Stéphane.


"Jérémy Jeanson" a écrit dans le message de news:

Bonjour Stéphane,

Vu que tu dois faire le téléchargement à partir d'une application maison,
la donne n'est pas la même. Mais fort heureusement si tu ne veux pas
partir avec un code trop complexe, il existe My.

Je sais que j'ai l'habitude de ne pas le conseiller (migration vers C# ou
autre langage plus lourde car on doit tout réécrire). Mais dans ton cas
tu peux utiliser l'exemple suivant :

If My.Computer.Network.IsConnected Then
If My.Computer.Network.Ping("www.duncanmackenzie.net") Then
Debug.WriteLine("Site Available")

My.Computer.Network.DownloadFile( _
"http://www.duncanmackenzie.net/Articles/", _
My.Computer.FileSystem.SpecialFolders.MyDocuments, _
ShowProgress:=True)
End If
End If

Tiré de la page
http://msdn.microsoft.com/en-us/magazine/cc163972.aspx
--
Jérémy JEANSON
MCP
http://www.jjeanson.fr






Avatar
Pour la 2e solution, je n'y arrive pas non plus.

J'ai ajouté la référence System.Web

Dans la boîte à outils, je n'ai pas de nouveaux contrôles, ni si je fais
Clic droit dans la boîte à outils puis Choisir les éléments.

Si je crée 1 FileUpload par le code, je n'arrive pas à l'utiliser en lui
"collant" quelque part mon URL.
Dim fu As New System.Web.UI.WebControls.FileUpload

Donc, impossible de récupérer la taille qui pourrait être soit ainsi :

taille = fu.FileBytes.Length

ou ainsi :

taille = fu.PostedFile.ContentLength



Mais bon, apparemment, c'est pour mettre des fichiers qui sont sur le disque
dur pour aller sur 1 serveur internet, donc ca ne correspondrait apparement
pas à mon besoin...



Je vais maintenant essayer de regarder la solution proposée par Fred.

Stéphane





<Stéphane> a écrit dans le message de news:

Donc, j'ai testé la 1ère solution, mais elle ne fonctionne pas.

J'ai l'URL de mon fichier à télécharger :
fichier_à_télécharger

A noter que le téléchargement en lui-même fonctionne parfaitement.

Pour info :
IO.File.Exists(fichier_à_télécharger) retourne False

Et ceci lève 1 exception :
Dim fi As IO.FileInfo = New IO.FileInfo(fichier_à_télécharger)
Exception :
Les formats URI ne sont pas pris en charge.

Si je n'exécute pas ces lignes, j'arrive ici :
BackgroundWorker_Téléchargement.RunWorkerAsync(fichier_à_télécharger)

Private Sub BackgroundWorker_Téléchargement_DoWork(ByVal sender As
System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles
BackgroundWorker_Téléchargement.DoWork

téléchargement_ok = télécharge(e.Argument.ToString)

End Sub

Function télécharge(ByVal url As String) As Boolean

Dim fichier As String = url.Substring(url.LastIndexOf("/") + 1)
téléchargement_fichier_complet = Me.TextBox_Répertoire.Text &
fichier

My.Computer.Network.DownloadFile(url, téléchargement_fichier_complet, "",
"", True, 100000, True)

Et le téléchargement démarre normalement.


Je vais maintenant regarder les autres solutions proposées.

Stéphane.


<Stéphane> a écrit dans le message de news:

Bonjour Jérémy,

Je n'ai pas de soucis avec le téléchargement.

Il fonctionne très bien, et justement avec la même méthode que tu viens
de signaler.

Je veux simplement connaiître la taille du fichier que je vais
télécharger, avant de le télécharger : ca me permettra ainsi de calculer
au fur et à mesure une estimation du temps restant pour le
téléchargement.

Je n'ai pas encore réessayé ce que tu as dit avant. Je te tiens au
courant.

Stéphane.


"Jérémy Jeanson" a écrit dans le message de
news:
Bonjour Stéphane,

Vu que tu dois faire le téléchargement à partir d'une application
maison, la donne n'est pas la même. Mais fort heureusement si tu ne veux
pas partir avec un code trop complexe, il existe My.

Je sais que j'ai l'habitude de ne pas le conseiller (migration vers C#
ou autre langage plus lourde car on doit tout réécrire). Mais dans ton
cas tu peux utiliser l'exemple suivant :

If My.Computer.Network.IsConnected Then
If My.Computer.Network.Ping("www.duncanmackenzie.net") Then
Debug.WriteLine("Site Available")

My.Computer.Network.DownloadFile( _
"http://www.duncanmackenzie.net/Articles/", _
My.Computer.FileSystem.SpecialFolders.MyDocuments, _
ShowProgress:=True)
End If
End If

Tiré de la page
http://msdn.microsoft.com/en-us/magazine/cc163972.aspx
--
Jérémy JEANSON
MCP
http://www.jjeanson.fr










Avatar
Merci Fred ! T'es trop fort ! Ca marche parfaitement bien !

Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click

Dim req As Net.HttpWebRequest

Dim rep As Net.HttpWebResponse

Dim url As String = "http://bldsoftware.com/pgrm/LeConjugueur.zip"

Dim taille As Long

req = Net.WebRequest.Create(url)

rep = req.GetResponse

taille = rep.ContentLength

MsgBox(taille)

End Sub



Merci encore,

Stéphane.




"Fred" a écrit dans le message de news:

in news:, Stéphane wrote :

Bonjour,



Bonjour,

Avant de télécharger un fichier sur internet via du code, est-il
possible de connaître la taille de ce fichier ?



Je pense, sans l'avoir testé, qu'il faut faire une requête http avec la
méthode HEAD.
Ensuit tu regardes le champ content-length dans la réponse.

Tout ceci avec les classes System.Net.HttpWebRequest et
System.Net.WebResponse.


--
Fred



Avatar
Et c'est la 3e solution donnée par Fred qui a fonctionné.

Donc Merci à Fred, mais également Merci à Jérémy pour s'être penché sur mon
problème.

Stéphane.


<Stéphane> a écrit dans le message de news:
%
Pour la 2e solution, je n'y arrive pas non plus.

J'ai ajouté la référence System.Web

Dans la boîte à outils, je n'ai pas de nouveaux contrôles, ni si je fais
Clic droit dans la boîte à outils puis Choisir les éléments.

Si je crée 1 FileUpload par le code, je n'arrive pas à l'utiliser en lui
"collant" quelque part mon URL.
Dim fu As New System.Web.UI.WebControls.FileUpload

Donc, impossible de récupérer la taille qui pourrait être soit ainsi :

taille = fu.FileBytes.Length

ou ainsi :

taille = fu.PostedFile.ContentLength



Mais bon, apparemment, c'est pour mettre des fichiers qui sont sur le
disque dur pour aller sur 1 serveur internet, donc ca ne correspondrait
apparement pas à mon besoin...



Je vais maintenant essayer de regarder la solution proposée par Fred.

Stéphane





<Stéphane> a écrit dans le message de news:

Donc, j'ai testé la 1ère solution, mais elle ne fonctionne pas.

J'ai l'URL de mon fichier à télécharger :
fichier_à_télécharger

A noter que le téléchargement en lui-même fonctionne parfaitement.

Pour info :
IO.File.Exists(fichier_à_télécharger) retourne False

Et ceci lève 1 exception :
Dim fi As IO.FileInfo = New IO.FileInfo(fichier_à_télécharger)
Exception :
Les formats URI ne sont pas pris en charge.

Si je n'exécute pas ces lignes, j'arrive ici :
BackgroundWorker_Téléchargement.RunWorkerAsync(fichier_à_télécharger)

Private Sub BackgroundWorker_Téléchargement_DoWork(ByVal sender As
System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles
BackgroundWorker_Téléchargement.DoWork

téléchargement_ok = télécharge(e.Argument.ToString)

End Sub

Function télécharge(ByVal url As String) As Boolean

Dim fichier As String = url.Substring(url.LastIndexOf("/") + 1)
téléchargement_fichier_complet = Me.TextBox_Répertoire.Text &
fichier

My.Computer.Network.DownloadFile(url, téléchargement_fichier_complet, "",
"", True, 100000, True)

Et le téléchargement démarre normalement.


Je vais maintenant regarder les autres solutions proposées.

Stéphane.


<Stéphane> a écrit dans le message de news:

Bonjour Jérémy,

Je n'ai pas de soucis avec le téléchargement.

Il fonctionne très bien, et justement avec la même méthode que tu viens
de signaler.

Je veux simplement connaiître la taille du fichier que je vais
télécharger, avant de le télécharger : ca me permettra ainsi de calculer
au fur et à mesure une estimation du temps restant pour le
téléchargement.

Je n'ai pas encore réessayé ce que tu as dit avant. Je te tiens au
courant.

Stéphane.


"Jérémy Jeanson" a écrit dans le message de
news:
Bonjour Stéphane,

Vu que tu dois faire le téléchargement à partir d'une application
maison, la donne n'est pas la même. Mais fort heureusement si tu ne
veux pas partir avec un code trop complexe, il existe My.

Je sais que j'ai l'habitude de ne pas le conseiller (migration vers C#
ou autre langage plus lourde car on doit tout réécrire). Mais dans ton
cas tu peux utiliser l'exemple suivant :

If My.Computer.Network.IsConnected Then
If My.Computer.Network.Ping("www.duncanmackenzie.net") Then
Debug.WriteLine("Site Available")

My.Computer.Network.DownloadFile( _
"http://www.duncanmackenzie.net/Articles/", _
My.Computer.FileSystem.SpecialFolders.MyDocuments, _
ShowProgress:=True)
End If
End If

Tiré de la page
http://msdn.microsoft.com/en-us/magazine/cc163972.aspx
--
Jérémy JEANSON
MCP
http://www.jjeanson.fr














1 2