Avatar billede kjeldsted Novice
01. april 2011 - 23:55 Der er 18 kommentarer og
1 løsning

Gemme fil lokalt

Hejsa folkens.

Først og fremmest vil jeg lige sige at jeg udemærket er klar over at Javascript og webprogrammering ikke er optimeret til det jeg søger efter en løsning på hér. Og lige for at sikre i er med må jeg hellere forklare at der hér er tale om at jeg er ved at lave et internt system der er beregnet til at skulle kunne kører på én PC (med IE8).

Jeg har et efterhånden næsten færdigt system hvor jeg gennem PHP får lavet nogle .png filer som er meningen skal gemmes lokal på den computer der kører forespørgslen. Efter en del søgen og testen har jeg fundet frem til hvordan jeg kan gemme en .txt fil i JS lokalt. Men er der nogle der kan svare mig på hvordan jeg vil kunne gøre det samme med de .png filer som jeg har lavet gennem PHP?

Mvh. Jens Kjeldsted
Avatar billede Slettet bruger
02. april 2011 - 00:53 #1
Det kan man ikke - og heller ikke .txt-filer ~ eller det troede jeg ?!?

Det nærmeste er et link til .png-filen, som automatisk starter download (i stedet for at vise filen).
- Google "php force download"

Men jeg kunne svært godt tænke mig at vide hvordan du gemmer en .txt-fil i brugerens filsystem ?
Avatar billede tjens Nybegynder
02. april 2011 - 10:36 #2
Prøv at kigge på Html Application
Der er html filer lagt på lokal harddisk med endelsen .HTA

I dem kan du bruge normal HTML og javascript som du kender det, men samtidig kan du køre ActiveX komponenter helt uden browserens restriktioner.

Og man kan blande javascript og vbscript, så du kan bruge de mange vbscript eksempler, der kan findes på nettet, direkte.

Der er et par eksempler her: http://tjens.dk/javascript/HTA/
De er dog centreret om at finde filer på hardisken og enten, flytte/kopiere eller starte programmer med parameter.
Husk de skal downloades til lokal harddisk, og virker kun på Windows.

Måske kan du lave en HTA, som viser din nuværende side i en stor IFRAME, og derefter navigerer ned i iframens DOM-træ for at fiske billederne ud.
Avatar billede olebole Juniormester
02. april 2011 - 16:51 #3
<ole>

T0M >> Det er et internt system. Der kan næsten alt lade sig gøre - og du kan f.eks. også compilere EXE-filer, skrevet i JScript  *o)

kjeldsted >> Som tjens nævner, kan du bruge HTA-filer (i princippet kan du bare gemme en HTML-fil med enxtension: .hta).

Men hvorfor blande PHP ind i projektet? Hvis du downloader ImageMagick, kan du billedbehandle med det via commandLine - men du kan også køre disse commandLines gennem Shell i en HTA. Og du kan også håndtere lokale databaser fra en HTA.

Yderligere info om HTA:
    http://msdn.microsoft.com/en-us/library/ms536496(v=vs.85).aspx
    http://msdn.microsoft.com/en-us/library/ms536473(v=VS.85).aspx

Info om FileSystemObject:
    http://msdn.microsoft.com/en-us/library/hww8txat(v=VS.85).aspx

Info om Shell:
    http://msdn.microsoft.com/en-us/library/bb774094(v=VS.85).aspx

- og du kan også up- og downloade binære filer via XMLHttpRequest og med hjælp fra ADO.

Men skal du rode dig ud i et sådan projekt, er det afgjort en fordel (Læs: nødvendighed), at du ved en del om Windows programmering.

/mvh
</bole>
Avatar billede olebole Juniormester
02. april 2011 - 17:26 #4
Prøv at forklare det nøjagtige workflow. Hvis din PHP ligger under en lokal Apache, er det jo bare at lave lidt filsystemgymnastik og lytte nogle filer på HD'en(?)

Hvis det således bare handler om at flytte nogle filer på HD'en, kan du skrive noget à la:


<script type="text/jscript">
function copyFiles(sFolderFromPath, sFolderToPath) {
  // Instantiate a Shell object
    var oShell = new ActiveXObject("Shell.Application"),
  // Get a reference to the folder be copied
    oFromFolder = oShell.NameSpace(sFolderFromPath);
   
  // Check that the folder exists
    if (oFromFolder) {
      // Get a reference to the folder to copy to
        var oToFolder = oShell.NameSpace(sFolderToPath);
      // Copy the files
        oToFolder.CopyHere(oFromFolder.Items());
    }
   
  // Clean up the kitchen!
    oFromFolder = oToFolder = oShell = null;
}

copyFiles("F:\\Kort", "C:\\Users\\Ole\\Desktop\\CopyToThis");
</script>



Skriv koden i en HTML-fil, du døber flytteTest.hta
Avatar billede olebole Juniormester
02. april 2011 - 17:28 #5
- og den kopierer indholdet af mappen Kort på mit F-drev til mappen CopyToThis på mit skrivebord
Avatar billede olebole Juniormester
02. april 2011 - 17:36 #6
tjens >> Prøv i øvrigt at sætte en Content-Type header på dine HTA-filer (f.eks. ved at serve dem med PHP):


<?php
header("Content-Type: application/hta");

// Read the HTA-file and write out here
?>

Avatar billede kjeldsted Novice
02. april 2011 - 20:56 #7
Puha der er sket noget i løbet af dagen. Mange tak for responsen da.
Kigger lige det hele nærmere igennem lidt senere. Men kan lige forklare at løsningen med at ordne det hele gennem PHP har været oppe at vende, men ham der skal have systemet kræver at PHP'en ligger på hostet server. Desværre.

Men vender tilbage igen når jeg får nær læst det hele :)
Avatar billede olebole Juniormester
02. april 2011 - 21:47 #8
Jeg ved endnu ikke, til hvad og hvordan din kunde skal bruge projektet. At løse det hele med PHP på en remote server, kan næppe blive særlig køn. Jeg ville nok lave det hele lokalt  =)

Han kan ikke downloade de færdige filer via HTTP og en browser på en pæn facon (igen afhængigt af til hvad og hvordan projektet skal bruges). Han kan dog downloade filerne binært med:


<script type="text/jscript">
function saveFile(sFileURL, strFilePath){
    var oHttp = new XMLHttpRequest();
    try{
        oHttp.onreadystatechange = function(sLoc){
            return function(){
                if(oHttp.readyState==4){
                    if(oHttp.status==200 || oHttp.status==0){
                        var oStream = new ActiveXObject("ADODB.Stream");
                        oStream.Open();
                        oStream.Type = 1;
                        oStream.Write(oHttp.responseBody);
                        oStream.saveToFile(sLoc, 2);
                        oStream.close();
                        alert("Finished!");
                    }
                }
            };
        }(strFilePath);
        oHttp.open("GET", sFileURL, true);
        oHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
        oHttp.send();
    }catch(e){
        alert(e.message);
    }   
}

saveFile("http://www.eksperten.dk/images/eksperten_logo.gif", "C:/Test/myCopyOfEkspertenLogo.gif");
</script>



Eksemplet kopierer Ekspertens logo til en lokal mappe. Filens lokale sti bliver: C:/Test/myCopyOfEkspertenLogo.gif
Avatar billede olebole Juniormester
02. april 2011 - 21:49 #9
PS: Seneste eksempel skal også afvikles fra en HTML-fil med extension .hta (En HyperText Application)
Avatar billede olebole Juniormester
02. april 2011 - 21:51 #10
- ups! Husk lige at null'e både oHttp og oStream, når de er færdigbrugt  *o)
Avatar billede kjeldsted Novice
02. april 2011 - 22:59 #11
Setup'et er således at systemet blot består af to sider. Den ene er en admin side der med en forbindelse med til MySQL server indeholder oplysninger, til at ændre, omkring font-type, størrelse, farve osv. for 20 forskellige bokse.

Der er så en anden side der indeholder 20 textarea's hvori man jo så kan skrive teksten til en given boks. (5 af dem er faktisk ikke textareas men dropdown menuer med fast indstillede tekster). Til hver boks er der en chekbox der angiver om den pågældende boks skal gemmes (altså overskrive den eksisterende lokale fil) eller om den skal ignoreres.

Ved at trykke på knappen 'Opdatér grafik' skal den så generer filerne om gemme dem lokalt.

Alt bortset fra delen med at få gemt filerne er sådan set lavet.
Avatar billede kjeldsted Novice
02. april 2011 - 23:00 #12
Og så prøvede jeg lige, bare for sjov, at copy-paste koden fra #8 hvortil jeg blot fik en alert med teksten 'Access is denied'
Avatar billede kjeldsted Novice
02. april 2011 - 23:55 #13
Ah, ja. Sikkerheds indstillinger i browseren. Måske en god idé at man er nødt til at gøre noget aktivt for at ændre dem :)

Ser lige på om ikke jeg kan få strikket noget sammen med det.
Avatar billede olebole Juniormester
03. april 2011 - 00:23 #14
Alt det, jeg skriver, handler om lokale filer - skrevet i HTML/JScript - og gemt med extension .hta.

Jeg taler ikke om noget, du kan gøre med HTML-filer i browseren
Avatar billede kjeldsted Novice
03. april 2011 - 00:41 #15
Jeg er da heller ikke så hurtigt i dag. Måske skulle jeg efterhånden gå i seng. Har arbejdet fra 10-20 så tror måske trætheden er skræmmende høj.

Men det tyder på jeg nok godt kan få noget ud af dette. Roder videre i morgen
Avatar billede tjens Nybegynder
03. april 2011 - 16:16 #16
Jeg har lavet en demo, som bruger min iframe idé fra #2,
kombineret med oloboles saveFile rutine fra #8.


Vejledning:  (testet på Windows 7)

Opret en folder C:\TestOutput, da demoen gemmer filerne her.

Første gang en HTA åbnes fra nettet, spørger window om lov, og du skal gemme den lokalt.

Højreklik på den gemte .HTA-fil og vælg Unblok i properties for at give scriptet adgang til din harddisk.

Dobbeltklik TestHTA.hta for at køre den.


Demo: http://tjens.dk/eksperten/935742/TestHTA.php

I demoens iframe vises en anden demo, hvor man kan klikke på billeder.
Alle viste billeder gemmes i TestOutput-folderen, når man klikker på knappen øverst.

Hvis dine billeder, der skal downloades, allerede vises på din nuværende side, kan du bruge demoen, og blot skifte src på iframe til at pege på din side.

Hvis dine billeder har faste navne på serveren, kan du køre uden iframe og taste faste værdier som sti til billeder, som olebole har vist i #8
Avatar billede olebole Juniormester
03. april 2011 - 17:07 #17
Det swinger, tjens  *o)

Hvis nogen skulle være blevet interesseret i HTA'er, vil jeg absolut anbefale at læse introduktionen og referencen, jeg linkede til ovenfor. F.eks. kan man lave en standard Windows icon (*.ico) og få den vist i HTA'ens captionbar. Selve programfilen bruger dog altid default ikonet for mshta.exe, som i virkeligheden er det program, der afvikler HTA'er.

Faktisk er HTA'er yderst anvendelige. Microsoft bruger dem selv af og til som wizards ... f.eks:
    C:\Program Files\Microsoft Office\Office12\InfoPath SDK\WIZARD.hta

- og jeg har set ret store business applikationer, der var skrevet i HTA'er. Dog har de deres helt klare begrænsninger (udover at koden er umiddelbart tilgængelig), f.eks. at to HTA'er ikke på egen hånd kan 'finde' hinanden. Er man tilstrækkelig kreativ, er det dog muligt at finde løsninger på deres mindre hensigtsmæssige sider  =)
Avatar billede kjeldsted Novice
14. april 2011 - 22:42 #18
Hm, sjovt.

Var da ellers sikker på at jeg havde svaret på det hér. Nå. Men i skal i hvert fald have mange tak for hjælpen. Det tyder på at swinge så kan helt sikkert godt bygge noget op over det her.

Så vidt jeg husker behøver jeg ikke at spørge Olebole om points, men hvis tjens vil havde lidt som tak for hjælpen smid da et svar :)
Avatar billede tjens Nybegynder
14. april 2011 - 23:56 #19
Hermed et svar fra mig.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester