Utilisisation de Fichier partager distant via http(sans Ftp)

Programmation d'applications complexes
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Utilisisation de Fichier partager distant via http(sans Ftp)

Message par Thyphoon »

Voilà le début de mon code permettant l'utilisation de Fichier mis sur un Seveur Web (supportant le php)
L'idée m'est venu un jour au boulot alors que j'avais oublié ma clef Usb avec mes fichiers pour bosser. Et comme au boulot le FTP est interdit...impossible d'utiliser le FTP.
Donc voilà ce que j'ai pendu. Actuellement on peu naviguer dans le repertoire et ouvrir les fichiers... Mais l'upload des fichiers une fois modifié ne fonctionne pas. Si quelqu'un veut me donner un coup de main il est le bien venu

Le Code Purebasic

Code : Tout sélectionner

Structure FileStructure
Name.s
Size.l
Type.b
EndStructure

Global Dim File.FileStructure(100),NbFile,Folder.s,AddPath.s
Folder="http://yann.lebrun.club.fr/temps/" ;Repertoire de base
AddPath=""; si jamais on navigue dans le repertoire de base


Enumeration
  #Main
EndEnumeration

;- Gadget Constants
;
Enumeration
  #ExplorerList
EndEnumeration

InitNetwork()

;-Procedure pour le Drag 'N Drop
Procedure.l DropFiles()
ProcedureReturn EventwParam()
EndProcedure

Procedure GetNumDropFiles(*dropFiles)
ProcedureReturn DragQueryFile_(*dropFiles, $FFFFFFFF, temp$, 0)
EndProcedure

Procedure.s GetDropFile(*dropFiles, index)
bufferNeeded = DragQueryFile_(*dropFiles, index, 0, 0)
For a = 1 To bufferNeeded: buffer$ + " ": Next ; Short by one character!
DragQueryFile_(*dropFiles, index, buffer$, bufferNeeded+1)
ProcedureReturn buffer$
EndProcedure

Procedure FreeDropFiles(*dropFiles)
DragFinish_(*dropFiles)
EndProcedure
;-DownloadFile

Procedure.s FindValue(header.s,find.s)
  ;OpenConsole()
 
  s.s=""
  i=FindString(header,find,1)
  If i>0
    s=Mid(header,i+Len(find),Len(header)-i-Len(find)) 
  EndIf   
 
  p=FindString(s,Chr(13)+Chr(10),1)
  If p>0 And i>0
    s=Left(s,p)   
  EndIf
 
  ProcedureReturn Trim(s)
EndProcedure

Procedure.b NiceDownload(URL.s,localfile.s)
  Protected ServerID.l, Header.s, *Buffer = AllocateMemory(1), String.s, Server.s, Path.s, i.l, DataLength.l,endOfHeader.b
 
  URL = RemoveString(URL,"http://",1)
  i = FindString(URL,"/",1)
  If i
    Server = Left(URL,i-1)
    Path = Right(URL,Len(URL)-i)
  Else
    Server = URL
  EndIf
 
  ServerID = OpenNetworkConnection(Server,80)
  If ServerID
    ;Header for the GET request
    Header = "GET /"+Path+" HTTP/1.1"+#CRLF$
    Header + "Host: "+Server+#CRLF$+#CRLF$
    SendNetworkData(ServerID,@Header,Len(Header)) ;Send the GET request
   
    Repeat
   
      Repeat ;Wait for it to start sending data
        Delay(2) ;No need to use 100% CPU while waiting
      Until NetworkClientEvent(ServerID) = #PB_NetworkEvent_Data
     
      Repeat ;Put all recieved data in a sring
        DataLength = ReceiveNetworkData(ServerID,*Buffer,1)
        String + PeekS(*Buffer,DataLength)
        If FindString(String,#CRLF$+#CRLF$,1)>0
          endOfHeader=1
          Break
        EndIf
      Until DataLength = 0
     
    Until endOfHeader=1
   
    FreeMemory(*Buffer) ;Don't need to use this memory anymore
    *Buffer=AllocateMemory(1024)
    maxlen=Val(FindValue(string,"Content-Length:"))
    totalr=0
   
    fid=CreateFile(#PB_Any,localfile)
    If fid<>0
      While totalr<maxlen
        Repeat ;Wait for it to start sending data
          Delay(2) ;No need to use 100% CPU while waiting
        Until NetworkClientEvent(ServerID) = #PB_NetworkEvent_Data
       
        Repeat ;Put all recieved data in a sring
          DataLength = ReceiveNetworkData(ServerID,*Buffer,1024)
          WriteData(fid,*Buffer,datalength)
          totalr + datalength
        Until DataLength < 1024 
       
        ;status = (1.0*totalr)/maxlen*100.0
        ;SetGadgetState(#ProgressBar_0,status)
        ;WindowEvent()
      Wend   
       
      CloseFile(fid)
    Else
      ProcedureReturn 0
    EndIf
   
    ProcedureReturn 1
  EndIf
EndProcedure

;-UploadFile

Procedure Upload(FullFileName$)
;################################################################
;# 22/2/2006 - Upload file to web trough POST command | Pantcho #
;################################################################

URL$ = Folder ; the main domain
PATH$ = "uploadfile.Php" ; or what ever script that accepts the enctype="multipart/form-data"
;FullFileName$ = "c:\pb\text.txt" ; Full path+filename
ActionName$ = "fichier" ; this is important!! this action must be the same as  <form ... name="fichier">
FileHeader$ = "Content-Disposition: form-Data; name="+Chr(34)+ActionName$ + Chr(34) +"; filename="+Chr(34)+ FullFileName$+ Chr(34) +#CRLF$
FileHeader$ + "Content-Type: text/plain" ; <= Here change the content type regarding your file! (text,image etc...) we go on text
; ^^^ note: Havn't been tested with binary files.
Border$ = "23232323232" ; Border to the file data (Check RFC for more info)


  conid.l = OpenNetworkConnection(URL$,80)
  If conid
      Debug "Connected"
      *Buffer = AllocateMemory(100000) ; some memory for our file buffer
      POST$ = "POST "+ PATH$ +" HTTP/1.0"  ; the Post command we are going to send to the server
   
      OpenFile(1,FullFileName$)
      Repeat
        Text$ = ReadString(1)
        FILE$ + Chr(13) + Chr(10)+Text$
      Until Eof(1)
      ; This is the border header for uploading
      FILE$ = "------"+Border$ + #CRLF$ + FileHeader$ +#CRLF$ + FILE$ + "------" + Border$ + "--"
      ; Back to post, while sending header with the correct content length (border+file+border)
      POST$ + #CRLF$ + "Content-Type: multipart/form-Data, boundary=----"+Border$ + #CRLF$ + "Content-Length: " + Str(Len(FILE$))
      POST$ + #CRLF$ + #CRLF$ + FILE$
      CloseFile(1)
      PokeS(*Buffer,"",0)
      PokeS(*Buffer,POST$,Len(POST$))
      SendNetworkData(conid,*Buffer,Len(POST$))
      Repeat
        Server$ = PeekS(*Buffer)
        Debug Server$
        res.l = ReceiveNetworkData(conid, *Buffer, 1000)
      Until Server$ = PeekS(*Buffer)
  Else
    Debug "NO CONNECTION"
  EndIf



EndProcedure

Procedure.s ReadServerinfo(Url.s)
  NiceDownload(Url,"Temps/temp.txt")
  String.s=""
  If ReadFile(0,"Temps/temp.txt")
    While Eof(0) = 0           ; Boucle tant que la fin du fichier n'est pas atteinte. (Eof = 'End Of File') 
      String+ ReadString(0)+Chr(10)      ; Affiche ligne par ligne le contenu du fichier
    Wend
 
  CloseFile(0)
  ;DeleteFile("Temps/temp.txt")
  EndIf
  ProcedureReturn String
EndProcedure

Procedure ExamineFile()
  Url.s=Folder+"File.php?path="+AddPath
  Directory.s=ReadServerinfo(Url)
  P_Start=FindString(Directory,"<Thyphoon>",0)
  P_End=FindString(Directory,"</Thyphoon>",0)
  Directory.s=ReplaceString(Mid(Directory,P_Start,P_End-P_Start),"<Thyphoon>","")
  NbFile = CountString(Directory,Chr(10))
  Debug "Nombre de Fichier..."+Str(NbFile)
  For a=1 To NbFile
  Ligne.s=StringField(Directory,a,Chr(10))
  Debug Ligne
  File(a)\Name=StringField(Ligne,1,",")
  Select StringField(Ligne,3,",")
   Case "dir"
    File(a)\Type=#PB_DirectoryEntry_Directory
   Case "file"
    File(a)\Type=#PB_DirectoryEntry_File
  EndSelect
  File(a)\Size=Val(StringField(Ligne,2,","))
Next
EndProcedure

Procedure UpdateExlorerlist()
ClearGadgetItemList(#ExplorerList)
For z=1 To NbFile
  AddGadgetItem(#ExplorerList,-1,File(z)\Name+Chr(10)+Str(File(z)\Size)+" Ko")
Next
EndProcedure

Procedure RunFile(n.l)
  url.s=Folder+AddPath+File(n)\Name;Url ou le Fichier est logé 
  NiceDownload(Url,AddPath+GetFilePart(Url));Téléchargement
  Date_Before=GetFileDate(AddPath+GetFilePart(Url), #PB_Date_Modified) ;On prend la date avant 
  RunProgram(AddPath+GetFilePart(Url),"", "", #PB_Program_Wait) ;On lance le fichier
  Date_After=GetFileDate(AddPath+GetFilePart(Url), #PB_Date_Modified) ;On prend la date apres
  If Date_Before<>Date_After ; si la date d'avant et d'apres est différente c'est que le fichier a été modifié
   Debug "on Upload le fichier"
   Upload(AddPath+GetFilePart(Url)) ;On upload le fichier modifier...
  Else
   Debug "pas besoin d'uploader"
  EndIf
EndProcedure

Procedure Open_Window()
  If OpenWindow(#Main, 0, 0, 668, 300, "Synchro", #PB_Window_ScreenCentered| #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    DragAcceptFiles_(WindowID(#Main), 1)
    If CreateGadgetList(WindowID(#Main))
      ListIconGadget(#ExplorerList, 0, 0, 350, 65, "", 200,#PB_ListIcon_GridLines)
      AddGadgetColumn(#ExplorerList, 0, "Name ", 65)
      AddGadgetColumn(#ExplorerList, 1, "Size ", 65)
      AddGadgetColumn(#ExplorerList, 2, "Type ", 65)     
      AddGadgetColumn(#ExplorerList, 3, "Modified ", 65) 
    EndIf
  EndIf
EndProcedure

Open_Window()
ExamineFile()
UpdateExlorerlist()
Repeat 
  Event = WaitWindowEvent() 
  
  Select Event
    Case #PB_Event_SizeWindow
      ResizeGadget(#ExplorerList, 0, 0, WindowWidth(#Main), WindowHeight(#Main))
    
    Case #WM_DROPFILES ;On upload les fichiers qu'on a Drag'ndropé
      *dropped = DropFiles()
      num.l = GetNumDropFiles(*dropped)
      f$ = ""
      For files = 0 To num - 1
      f$ + GetDropFile(*dropped, files) + Chr (13)
      Next
      MessageRequester("Drag 'n' Drop", Str (num) + " file (s) dropped:" + Chr (13) + Chr (13) + f$)
      FreeDropFiles(*dropped)
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #ExplorerList
          Select EventType() 
            Case #PB_EventType_LeftDoubleClick
              ;On selectionne le fichier qu'on veut charger
              f=GetGadgetState(#ExplorerList)+1
              ;Si on a un fichier
              If f>0 And File(f)\Type=#PB_DirectoryEntry_File
                Debug "chargement du fichier"
                Thread = CreateThread(@RunFile(), f) ;On lance le fichier sous forme de Thread ce qui permet de ne pas bloquer l'application
              ;Si on a un repertoir  
              ElseIf f>0 And File(f)\Type=#PB_DirectoryEntry_Directory
                Debug "changement de repertoir>"+AddPath+"<"
               ;Si on doit retourner en arrière dans le chemin
               If AddPath<>"" And File(f)\Name=".."
                 Debug "Ancien:"+AddPath
                 For z=Len(AddPath)-1 To 0 Step -1
                  If z=1 Or Mid(AddPath,z,1)="/"
                  Break
                  EndIf
                 
                Next
                AddPath=Left(AddPath,z-1)
                Debug "Nouveau:"+AddPath +"("+Str(z)+")"
                ExamineFile()
                UpdateExlorerlist()
               ;Sinon on rajoute le chemin
               ElseIf File(f)\Name<>"." And File(f)\Name<>".."
                
                AddPath+File(f)\Name+"/"
                CreateDirectory(AddPath)
                ExamineFile()
                UpdateExlorerlist()
               EndIf
              EndIf
              
              
              
              ;
          EndSelect
          

      EndSelect

  EndSelect
  
   

Until  Event = #PB_Event_CloseWindow
Le code File.php (Mais pour tester vous n'en avez pas spécialement besoin sauf si vous voulez essayer avec votre propre serveur)

Code : Tout sélectionner

$path=$_GET[path];
$dir = "./".$path;
// Ouvre un dossier bien connu, et liste tous les fichiers
if (is_dir($dir)) {
   echo "<Thyphoon>";
    if ($dh = opendir($dir)) {
        while (($file = readdir($dh)) !== false) {
            echo $file.",".@filesize($dir . $file).",".@filetype($dir . $file).chr(10); 
        }
        closedir($dh);
    }
    echo "</Thyphoon>";
}