Aller au contenu

Télécharger et executer un fichier


Messages recommandés

Posté(e)

Bonjour,

 

Est-il possible, à patrir d'un lisp, d'éxecuter un fichier se trouvant sur le net.

 

un truc du genre :

(commandelisp "http://www....../...../toto.exe")

 

toto.exe étant, par exemple, un fichier zip auto-extractible.

 

Merci

Posté(e)

Salut

 

La réponse est OUI

 

 

La solution

 

(setq shell (vlax-create-object "Shell.Application"))
(vlax-invoke shell 'open "http://un_lien_a_telecharger.zip")
(vlax-release-object shell)

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Merci pour ta réponse.

effectivement ça marche! mais...

 

Bah oui, y'a toujours un "mais".

 

Comment faire pour que l 'internet explorer ne s'ouvre pas ET pour que je puisse choisir à la place de l'utilisateur le fait de 'executer" "enregistrer" ou "annuler" ?

 

a+

 

[Edité le 22/2/2007 par l56]

Posté(e)

Hummm... pas facile.

 

J'ai même recherché avec ie, mais c'est le même résultat

 (setq ie (vlax-Create-Object "InternetExplorer.Application"))
(vlax-invoke ie 'navigate "un_lien_a_telecharger.zip")
(vlax-release-object ie)

 

Je pensais aussi utiliser WScript.Shell pour faire un copier, mais que nenni :casstet:

 

Il reste la solution du SendKey, mais ce n'est pas terrible à mon gout.

 

Je continue de chercher....

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Merci de te pencher sur mon pb. C'est sympa.

 

Effectivement, sendkey n'est pas très élégant.

Mais c'est une idée interessante. et c'est surtout un truc que je viens de découvrir !

 

Merci a toi

 

bye

 

 

Posté(e)

Voila, j'ai trouve la solution grace à TheSwamp

 

(defun telecharger(lien rep / cp ok tmp util)
 (setq util (vla-get-Utility (vla-get-ActiveDocument (vlax-get-acad-object))))
 (if (eq (vla-isurl util lien) :vlax-true)
   (if (vl-catch-all-error-p (vl-catch-all-apply 'vla-GetRemoteFile (list util lien 'tmp :vlax-true)))
     (princ "\nErreur lors du téléchargement.")
     (progn
(setq cp (strcat rep (vl-filename-base lien) (vl-filename-extension lien)))
(if (findfile cp)
  (vl-file-delete cp)
)
(if (vl-catch-all-error-p (vl-catch-all-apply 'vl-file-copy (list tmp cp)))
  (progn
 	    (princ "\nImpossible de déplacer le fichier \""
	   (strcat (vl-filename-base cp)(vl-filename-extension cp))
	   "\" depuis le répertoire \n\""
	   tmp
    )
    (vl-file-delete tmp)
  )
  (progn
    (vl-file-delete tmp)
           (if (zerop (vl-file-size cp))
             (progn
	(vl-file-delete cp)
	(princ "\nImpossible de télécharger le fichier.")
      )
      (setq ok T)
    )
  )
)
     )
   )
   (princ "\nLe lien n'est pas valide.")
 )
 ok
)

 

Exemple

(if (telecharger "un_lien_a_telecharger.zip" "c:\\")
(alert "Cela s'est bien passé")
(alert "Il y a eu un problème")
)

 

@+

 

[Edité le 26/2/2007 par Patrick_35]

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Une autre méthode de faire avec une meilleure gestion des erreurs.

 

(defun download (url dir / byte fic file fso http ok tbl tst)
 (setq http (vlax-create-object "MSXML2.XMLHTTP")
       fso  (vlax-create-object "Scripting.FileSystemObject")
cmd (getvar "cmdecho"))
 (vlax-invoke-method http 'open "get" url :vlax-false)
 (if (vl-catch-all-error-p (vl-catch-all-apply 'vlax-invoke (list http 'send)))
   (princ (strcat "\nLe lien " url " n'est pas valide."))
   (if (eq (vlax-get http 'status) 200)
     (progn
(princ "\nTéléchargement en cours...")(princ)
(while (not (eq (vlax-get http 'readystate) 4)))
(setq file (strcat dir (vl-filename-base url) (vl-filename-extension url))
      tbl  (vlax-safearray->list (vlax-variant-value (vlax-get-property http 'responsebody))))
(if (vl-catch-all-error-p (setq fic (vl-catch-all-apply 'vlax-invoke (list fso 'createtextfile file))))
  (princ (strcat "\nImpossible de créer le fichier " file))
  (if (setq tst (findfile file))
    (if (< (length tbl) (vlax-get (vlax-invoke fso 'getdrive (substr tst 1 1)) 'freespace))
      (progn
	(foreach byte tbl
	  (vlax-invoke fic 'write (vl-list->string (list byte)))
	)
	(setq ok T)
      )
      (princ (strcat "\nPlus de place sur le disque " (substr tst 1 1)))
    )
    (princ (strcat "\nImpossible de créer le fichier " file))
  )
       )
       (if (not (vl-catch-all-error-p fic))
  (progn
    (vlax-invoke fic 'close)
    (if (not ok)
      (vlax-invoke fso 'deletefile file)
    )
  )
)
     )
     (if (eq (vlax-get http 'status) 404)
(princ "Fichier introuvable...Erreur 404.")
(princ (strcat "\n" (vlax-get http 'statustext) "...Erreur " (itoa (vlax-get http 'status)) "."))
     )
   )
 )
 (vlax-release-object http)
 (vlax-release-object fso)
 ok
)

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Effectivement, il y a plus de verifs.

Mais il s'assure de l'existence du fichier à télécharger en le téléchargeant.

Ce qui est tres ennuyeux si le fichier est lourd.

 

(vl-catch-all-apply 'vlax-invoke (list http 'send))

 

J'aimerai verifier s'il le fichier existe, et s'il existe proposer le téléchargement, or avec la methode utilisé la vérification de l'existance du fichier est trop longue.

 

Il faudrait une fonction du type (findfile ...)

 

Qu'en penses-tu ?

 

[Edité le 1/3/2007 par l56]

Posté(e)

Ce qui est tres ennuyeux si le fichier est lourd.

Tout à fait d'accord, mais dans ce cas, utilise la boite de dialogue pour voir l'état du téléchargement, car en cas de gros fichier, on a l'impression qu'autocad est "planté"

 

Il faudrait une fonction du type (findfile ...)

Ou plus simplement l'interroger pour connaitre sa taille. Je sais que des logiciels de téléchargement le font, donc cela doit pouvoir se trouver.

 

Et en réflechissant, je suis ennuyé avec cette boucle car elle ne finit pas (ou c'est l'impression qu'elle donne)

(while (not (eq (vlax-get http 'readystate) 4)))

Le 4 signifie que le téléchargement est terminé.

Il va falloir que j'y réflechisse un peu plus en profondeur

 

@+

 

[Edité le 1/3/2007 par Patrick_35]

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Ca s'améliore, ça s'améliore

 

(defun download (url dir / byte fic file fso http ok tbl taille)
 (setq http (vlax-create-object "MSXML2.XMLHTTP")
       fso  (vlax-create-object "Scripting.FileSystemObject")
file (strcat dir (vl-filename-base url) (vl-filename-extension url)))
 (vlax-invoke-method http 'open "get" url :vlax-false)
 (if (vl-catch-all-error-p (vl-catch-all-apply 'vlax-invoke (list http 'send)))
   (princ (strcat "\nLe lien " url " n'est pas valide."))
   (if (eq (vlax-get http 'status) 200)
     (if (vl-catch-all-error-p (setq taille (vl-catch-all-apply 'vlax-invoke (list http 'getResponseHeader "Content-Length"))))
(princ "\nErreur de lecture sur la taille du fichier.")
       (if (< (atoi taille) (vlax-get (vlax-invoke fso 'getdrive (substr (vlax-invoke fso 'getabsolutepathname file) 1 1)) 'freespace))
  (progn
    (princ "\nTéléchargement en cours...")(princ)
    (while (not (eq (vlax-get http 'readystate) 4))
      (vla-eval (vlax-get-acad-object) "DoEvents")
    )
    (setq tbl (vlax-safearray->list (vlax-variant-value (vlax-get-property http 'responsebody))))
    (if (vl-catch-all-error-p (setq fic (vl-catch-all-apply 'vlax-invoke (list fso 'createtextfile file))))
      (princ (strcat "\nImpossible de créer le fichier " file))
      (progn
	(foreach byte tbl
	  (vlax-invoke fic 'write (vl-list->string (list byte)))
	)
	(vlax-invoke fic 'close)
	(setq ok T)
      )
    )
  )
)
     )
     (princ (strcat "\n" (vlax-get http 'statustext) "...Erreur " (itoa (vlax-get http 'status)) "."))
   )
 )
 (vlax-release-object http)
 (vlax-release-object fso)
 ok
)

 

Il me reste plus qu'à trouver le moyen d'afficher la boite de téléchargement pour que cela soit parfait

 

@+

 

[Edité le 2/3/2007 par Patrick_35]

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

  • 3 semaines après...
Posté(e)

J'ai mis un peu de temps a te répondre car j'était absent.

 

Je viens de tester ton code, il est parfait.

La boite de dialoque pour afficher une barre de progression serait effectivement bien venu mais pour des tous petits fichiers, on peut s'en passer.

 

Merci encore

bye

  • 1 mois après...
Posté(e)

Salut,

 

Bon maintenant que je sais le faire dans un sens, comment peut-on faire l'inverse ?

Son mon disque dur, j'ai un fichier, fic.txt par exemple, et j'aimerai pouvour l'envoyer de maniere transparente dans un dossier de mon site.

 

c:\dossier\fic.txt vers www.monsite/dossier

 

tout cela à partir d'autocad, bien sur.

 

Patrick_35, je m'en remet à toi car la com. entre autocad et le web, c'est un mystere.

 

A+

Posté(e)

Salut

Un mystère, grand dieu non. Je me contente de traduire d'un langage à un autre ;)

 

Tu as toutes les explications ici par exemple après une recherche rapide sur le net. Le tout est de trouver l'activex MSXML2.XMLHTTP

Donc à la lecture du lien ci-dessus, on devrait faire logiquement

(vlax-invoke-method http 'open "post" url :vlax-false)

 

J'ai juste remplacé par rapport au lisp précedent le get par post

 

Sinon, tu as aussi plus simplement

 (vla-putremotefile (vla-get-utility (vlax-get-acad-object)) Url Mon_Fichier.exemple)

 

ps : c'est du non-testé

 

@+

 

 

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

(vlax-invoke-method http 'open "post" url :vlax-false)

Remplacer "get" par "post" ne doit pas etre suffisant

j'avance dans le noir, mais n'y aurai-t-il pas quelque chose à changer dans le code ci-dessous ?

(vl-catch-all-apply 'vlax-invoke (list http 'send))

ou ailleurs...

 

Quand à

(vla-putremotefile (vla-get-utility (vlax-get-acad-object)) Url Mon_Fichier.exemple)

Quoi que j'essaie, Il renvoi:

Le serveur ActiveX a renvoyé l'erreur: nom inconnu: Utility

 

Si tu as le temps, merci de t'interesser au problème.

a+

Posté(e)

Salut

(setq file (findfile "Un_lisp.lsp")
     url "http://mon_adresse/Lisp/Un_Lisp.lsp"
)

 

Ca devrait fonctionner maintenant car je n'avais pas donné la bonne classe objet :red:

(vla-putremotefile (vla-get-utility (vla-get-activedocument (vlax-get-acad-object))) url file))

 

Je ne peux pas tester en upload et donc t'en dire d'avantage sur MSXML2.XMLHTTP ou Microsoft.XMLHTTP

 

ps : c'est du java. Peut-être que notre cher webmaster pourrait éclairer notre lanterne ? ;)

 

@+

 

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Bonjour à vous,

 

Est-ce que cela veut dire que nous pourrions exécuter des lisp via le net ?

 

Il n'y a pas d'homme cultivé, il n'y a que des hommes qui se cultivent.

 

Maréchal Foch

Posté(e)

Pour Morgul,

 

Je ne sais pas si on peut executer des LISP qui se trouveraient dans un dossier d'un site,

mais tu peux le ramaner sur ton disque dur puis le charger ...

 

Sinon patrick,

 

AutoCAD me renvoi

; erreur: Erreur Automation Inet: HTTP_STATUS_BAD_METHOD 405 - la

méthode n'est pas autorisée

 

C'est peut etre normal, car quand j'utilise lecchFTP pour faire un déplacement du fichier de mon ordi vers le site, j'ai entré avant des codes d'acces. (URL, Nom d'utilisateur et mot de passe)

Comment puis-je les rentrer en LISP ?

Posté(e)

Salut

Il va falloir faire une recherche car il faut surement donner quelque part un mot de passe avec un login.Je n'ai pas trop le temps en ce moment, mais dès que j'ai l'occasion, je pense à toi

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

  • 2 mois après...
  • 2 mois après...
Posté(e)

heu, oui

Et depuis le temps qu'il est passé à la machine à laver, pas facile à défaire ;)

 

Plus sérieusement, j'ai recherché mais pas trouvé. J'ai trouvé plusieurs syntaxe par le biais du java via activex, mais rien de concluant

Je séche pour l'instant :(

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Salut Patrick_35,

 

(setq tbl (vlax-safearray->list (vlax-variant-value (vlax-get-property http 'responsebody))))

(if (vl-catch-all-error-p (setq fic (vl-catch-all-apply 'vlax-invoke (list fso 'createtextfile file))))

....

 

Ce code ci-dessus est extrait de la routine que tu a fait (voir réponse n°10 ce ce fil),

Ce qui m'étonne, c'est qu'il fonctionne tres bien sauf sur la version 2008.

La liste tbl contient des valeurs superieur à 256. C'est étrange, je ne comprend pas pourquoi.

Si tu as une minute ...

 

Par avance merci.

Bon WE

L56

 

 

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité