Avatar billede JacoDK Nybegynder
18. september 2012 - 07:09 Der er 13 kommentarer og
1 løsning

Download af datafil på server med efterfølgende læsning

Hej Eksperter,

Jeg har en datafil på en lille webserver, hvor webserveren generere datafilen linje for linje når den bliver forespurgt i browseren eller via php.

Mit spørgsmål er om man kan sætte min php kode til at lave forespørgslen, hvorefter den downloader filen når den er færdig genereret, således den ikke laver en timeout.

Jeg har min hjemmeside hos Unoeuro, og den laver en forespørgsel til en ekstern server på en privat adresse og port.

Jeg har prøvet med set_time_limit();, men Unoeuro har safemode på.

Derudover har jeg prøvet at læse filerne med henholdsvis:
file_get_contents og fopen/fread
Avatar billede olebole Juniormester
18. september 2012 - 13:50 #1
<ole>

Jeg tror, du må forklare lidt tydeligere  =)

/mvh
</bole>
Avatar billede JacoDK Nybegynder
18. september 2012 - 17:10 #2
En dybere forklaring er at jeg har et solcelle anlæg på taget, hvortil inverteren logger alt data, hvorefter jeg kan hente det via den indbygget webserver. Problemet er at den generere loggen når jeg tilgår webserveren, hvilket godt kan tage 5 minutter. Så er det muligt at lave en kode hvortil den kan hente/downloade den genrerede fil fra webserveren ?
Avatar billede olebole Juniormester
18. september 2012 - 17:36 #3
Betyder det, at du ønsker et program, der med jævne mellemrum kalder webserveren og derved downloader filen - eller?

Hvordan tilgår du webserveren? Medsender du logininformationer, når du kalder webserveren?
Avatar billede olebole Juniormester
18. september 2012 - 17:38 #4
PS: Hvilket tegnsæt er filen gemt med?
Avatar billede olebole Juniormester
18. september 2012 - 17:39 #5
- og er det en alm. *.txt eller *.xml, eller?
Avatar billede olebole Juniormester
18. september 2012 - 17:44 #6
- og skal den overskrive en evt. allerede downloaded fil? Eller skal den navngives med et timestamp og gemmes individuelt, eller?
Avatar billede JacoDK Nybegynder
19. september 2012 - 05:58 #7
"Betyder det, at du ønsker et program, der med jævne mellemrum kalder webserveren og derved downloader filen - eller?"

Ja, da filen genereres ved hver forspørgsel vil det være lettere at downloade når den er færdig med at generere loggen.

Jeg tilgår loggen ved at indtaste:
http://bruger:kode@IP/LogDaten.dat

Datafilen er alm tekst med en masse tabulator og nye linjer, så den er let nok at læse, og id til databasen kan gøres med tidsstempel, således der ikke kommer dobbelt i databasen :)
Avatar billede olebole Juniormester
19. september 2012 - 23:03 #8
1) Skal den downloadede fil overskrive en allerede downloaded?

2) Hvilket tegnsæt er filen gemt med - og/eller hvilket tegnsæt bruger du i det PHP, som skal viderebehandle/gemme/vise data?
Avatar billede JacoDK Nybegynder
20. september 2012 - 16:16 #9
1.) Ja, så er data'en gemt indtil der kommer nyt i loggen

2.) Selve koden har jeg. Men du er velkommen til at se lidt af den data som ligger i loggen:

    11814      349      4440      1525    39327    16397      353      4310      1492    39336    49162        0        0        0    39329        3      238      3920      927    43836      238      3950      936    43823      235      4060      953    43811    50.0        1        0        0        0        0      191        0      3        0


Jeg er bare ude efter at kunne gøre som i spørgsmål 1.


1) Skal den downloadede fil overskrive en allerede downloaded?
Avatar billede olebole Juniormester
20. september 2012 - 18:02 #10
add. 2) Jeg spørger ikke om nogen kode, men hvilket tegnsæt, du bruger ... utf-8 eller iso-8859-1?
Avatar billede JacoDK Nybegynder
20. september 2012 - 18:55 #11
Okay :) det misforstod jeg.

Jeg bruger UTF-8
Avatar billede olebole Juniormester
20. september 2012 - 22:37 #12
Jeg går udfra, at årsagen til den lange eksekveringstid ligger 'på taget' - og at det ikke syldes eksorbitante mængder data.

Anyway, så har jeg lavet en løsning (håber, du bruger Windows), som downloader filen til din PC og gemmer en backup. Herefter forsøger den at uploade filen til din server.

Gem denne fil som DataLogDownload.hta:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<hta:application ID="oDataLogApp"
    APPLICATIONNAME="Data Log Download"
    VERSION="1.0"
    CAPTION="yes"
    BORDER="dialog"
    INNERBORDER="no"
    MAXIMIZEBUTTON="no"
    SHOWINTASKBAR="yes"
    SINGLEINSTANCE="yes"
    WINDOWSTATE="normal"></hta:application>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=9">
<meta http-equiv="MSThemeCompatible" content="yes">
<title></title>
<script type="text/javascript">
window.resizeTo(600, 240);
window.moveTo((screen.availWidth-600)/2, (screen.availHeight-240)/2);
document.title = oDataLogApp.applicationName;
</script>
<style type="text/css">
html, body {
    margin: 0;
    padding: 0;
    font: 12px "Segoe UI", Tahoma, sans-serif;
    overflow: hidden;
    background: #dedede;
}
* {
    cursor: default;
}
fieldset {
    margin: 12px 16px;
}
.controls {
    padding-bottom: 10px;
}
p {
    margin: 0;
    text-align: center;
}
#statusDispl {
    height: 7em;
    margin: 12px;
    padding: 5px;
    border: 1px inset #fff;
    background: #f0f0f0;
    overflow: auto;
}
#statusDispl div {
    white-space: nowrap;
}
.emph-text {
    font-weight: bold;
}
</style>
<script type="text/javascript">
// Edit first three variables
var sFetchURL = "http://www.google.dk/",
sUploadURL = "http://localhost/save_log_file.php",
sBackUpFile = "myLogFile.dat",
// Stop edit
oXhr = elmBtn = null;

function downloadFile(btn) {
    elmBtn = btn;
    btn.disabled = true;
    writeStatus("");
    writeStatus("Preparing to call: '"+sFetchURL+"'");
    oXhr = new XMLHttpRequest();
    oXhr.open("GET", sFetchURL+"?u="+new Date().getTime(), true);
    oXhr.onreadystatechange = function() {
        switch (this.readyState) {
            case 2:
                writeStatus("Download request sent.");
            break;
            case 3:
                writeStatus("Recieving data.");
            break;
            case 4:
                if (sBackUpFile) writeFile();
                if (sUploadURL) uploadFile();
                else oXhr = null;
            break;
        }
    }
    oXhr.send(null);
}
function writeFile() {
    var oStrm = new ActiveXObject("ADODB.Stream"),
    oStrmOut = new ActiveXObject("ADODB.Stream");
    oStrm.type = 2;
    oStrm.mode = 3;
    oStrm.charset = "utf-8";
    oStrm.open();
    oStrm.writeText(oXhr.responseText);

    oStrm.position = 3;
    oStrmOut.type = 1;
    oStrmOut.mode = 3;
    oStrmOut.open();
    oStrm.copyTo(oStrmOut);
    oStrmOut.saveToFile(sBackUpFile, 2);
   
    oStrm.flush();
    oStrm.close();
    oStrmOut.flush();
    oStrmOut.close();
    oFso = oStrmOut = oStrm = null;
   
    writeStatus("Logfile saved as: '"+sBackUpFile+"'", true);
    elmBtn.disabled = false;
}
function uploadFile() {
    var sQuery = "context=saveLog&logData="+encodeURIComponent(oXhr.responseText);
    writeStatus("Preparing to call: '"+sUploadURL+"'");
    oXhr = new XMLHttpRequest();
    oXhr.open("POST", sUploadURL, true);
    oXhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
    oXhr.onreadystatechange = function() {
        switch (this.readyState) {
            case 2:
                writeStatus("Upload request sent.");
            break;
            case 3:
                writeStatus("Recieving result.");
            break;
            case 4:
                finishUpload();
            break;
        }
    }
    oXhr.send(sQuery);
}
function finishUpload() {
    try {
        var oResp = JSON.parse(oXhr.responseText);
    }
    catch(e) {
        return writeStatus("Fejl: "+e.message, true);
    }
    if (oResp.error) writeStatus(oResp.error, true);
    else if (oResp.success) writeStatus(oResp.success, true);
    oResp = oXhr = null;
}

/* ********** Display functions ********** */
function zeroPad(s, len) {
    s += "";
    return "0000000000".substr(0, (len||2)-s.length)+s;
}
function writeStatus(sTxt, bBold) {
    if (sTxt==="") return statusDispl.innerHTML = "";
    var oD = new Date();
    statusDispl.innerHTML = (bBold?"<div class='emph-text'>\u2022 ":"<div>") + "["
                          + zeroPad(oD.getHours()) + ":"
                          + zeroPad(oD.getMinutes()) + ":"
                          + zeroPad(oD.getSeconds()) + "] - "
                          + sTxt + "</div>"
                          + statusDispl.innerHTML;
}
</script>
</head>
<body onselectstart="return true" oncontextmenu="return false">

<fieldset>
    <legend>Download logfile </legend>
    <div class="controls">
        <div id="statusDispl"></div>
        <p><button onclick="downloadFile(this)">Download</button></p>
    </div>
</fieldset>

</body>
</html>

- og ret de tre første variabler til passende stier. Navnene burde være rimelig selvforklarende  =)

Din PHP-fil save_log_file.php skal så se sådan ud (ret igen første variabel til en passende sti:

<?php
function saveLog($json) {
    // Edit the following variable
    $sPathToLogFile = $_SERVER['DOCUMENT_ROOT'].'sti/til/myLogFile.dat';
    // Stop editing
   
    $fp = @fopen($sPathToLogFile, 'w');
    if ($fp===false) {
        $json->error = 'Could not open "myLogFile.dat".';
        return $json;
    }
    $nWrittenChars = @fwrite($fp, $_POST['logData']);
    if ($nWrittenChars===false) {
        $json->error = 'Could not write data to "'.$sPathToLogFile.'".';
        return $json;
    }
    fclose($fp);
    $json->success = $sPathToLogFile.' was saved successfully.';
    return $json;
}

$json = new stdClass();
if (!empty($_POST)) {
    switch ($_POST['context']) {
        case 'saveLog':
            $json = saveLog($json);
        break;
        default:
            $json->error = 'Unknown contextID: "'.$_POST['context'].'".';
    }
}
else $json->error = 'Expected POST variables. Recieved none.';

$sJson = json_encode($json);
header('Content-Type: application/json; charset=utf-8');
header('Content-Length: '.strlen($sJson));
echo $sJson;
?>
Avatar billede olebole Juniormester
20. september 2012 - 22:39 #13
- og DTD'en ser sådan ud:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
Avatar billede JacoDK Nybegynder
08. august 2015 - 18:13 #14
Lukker spørgsmålet
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