Yesterdayโs Download and Copy or Move Primer Tutorial was all about the โclient sideโ of โฆ
- the โserverโ side web applications/pages โฆ and โฆ
- a โclientโ side listener (like we talked about with Korn Shell listeners with Pandoc Document Conversion Email Tutorial)
โฆ and weโve just โtweakedโ (albeit, very importantly, in our books (โฆ but the pamphlettes are still not playing ball)) to ensure no โfile clobberingโ takes place so that the Korn Shell now does โฆ
suf=""
isuf=-1
while [ -f "${dpath}/${brest}${suf}" ]; do
((isuf=isuf+1))
suf="_${isuf}"
done
if [ ! -z "$suf" ]; then
echo "mv ${dpath}/${brest} ${dpath}/${brest}${suf} # `date`" >> download_to_place.out
mv ${dpath}/${brest} ${dpath}/${brest}${suf} >> download_to_place.out 2>> download_to_place.err
fi
โฆ in download_copierksh download_copierksh Korn Shell scripting on our macOS operating system โclientโ.
But today is mainly about filling in the missing bits on the โserverโ side. This (need for a) โconduitโ we referred to yesterday is because we accept no folder paths can be mentioned at the โserverโ end. Suppose, though, that the โnon-pathedโ filename we supply to an โaโ linkโs โdownloadโ attribute can be prefixed by a mildly mashed up version of that path we copy to from the Downloads folder of your โclientโ computer or device, as you perform a โdownloadโ via the clicking of an โaโ link.
Well, at this blog weโd already started functionality to toggle the use or not of โฆ
- โaโ links โฆ with โฆ
- โhrefโ attribute containing โGETMEโ โฆ
- but not โdiff.phpโ โฆ and โฆ
- โdownloadโ attribute (the attribute necessary to โdownloadโ rather than our default displaying of source code in a new webpage)
Were you here, then, when we published WordPress Blog Download Mode Toggler Primer Tutorial (or were you indisposed again?!) There we established an โAll Postsโ menu โToggle Download Mode from GETMEโ option piece of functionality to toggle between โฆ
- displaying of source code in a new webpage for GETME โaโ links โฆ versus โฆ
- use thechanged PHP toggle_download
php in conjunction with a changed good โol TwentyTen Theme header.php as below โฆ
<?php
if (outs == null) {
var dnprefix=decodeURIComponent(('' + localStorage.getItem('download_copy_to_folder')).replace(/^null$/g,'')).replace(/\+/g,' ').replace(/\\\\/g, '_').replace(/\//g, '_').replace(/\:/g, '_');
for (idmjk=0; idmjk<admjk.length; idmjk++) {
if (admjk[idmjk].href.indexOf('GETME') != -1 && admjk[idmjk].href.indexOf('diff.php') == -1) {
if (origcafd < 0) { //!cafd) {
xp=admjk[idmjk].href.split("GETME");
prexp=xp[0].split("/");
postprexp=prexp[-1 + prexp.length].split(".");
extis = postprexp[-1 + postprexp.length].replace(/_/g,"").replace(/-/g,"").replace(/GETME/g,"");
outs="//www.rjmprogramming.com.au/getmelist.htm?topoff=150&tsp=" + (Math.floor(Math.random() * 1999900) + 100) + "#" + postprexp[0] + "." + postprexp[-1 + postprexp.length].replace(extis,"").replace(extis,"").replace(extis,"") + "GETME" + extis;
aorig=admjk[idmjk].innerHTML;
admjk[idmjk].innerHTML=admjk[idmjk].innerHTML.replace(".","<span data-alt='" + outs + "' id='spn" + cafd + "' title=\" + Code Download Table\" onclick=\"if (cafd == cafd) { cafd=" + cafd + "; changeasfordownload(); } else { window.open('" + outs + "','_blank','top=100,left=100,width=500,height=500'); } return false; \"></span>");
if (aorig == admjk[idmjk].innerHTML && admjk[idmjk].innerHTML.indexOf('er posts') == -1) admjk[idmjk].innerHTML=admjk[idmjk].innerHTML.replace(" ","<span data-alt='" + outs + "' id='spn" + cafd + "' title=\" + Code Download Table\" onclick=\"if (cafd == cafd) { cafd=" + cafd + "; changeasfordownload(); } else { window.open('" + outs + "','_blank','top=100,left=100,width=500,height=500'); } return false; \"></span>");
cafd++;
} else {
prestuffs = admjk[idmjk].href.split('/');
newaspare = admjk[idmjk].href.replace('_-GETME', '').replace('__GETME', '').replace('_GETME', '').replace(big, '');
while (big.indexOf('-') != -1) {
big = big.replace('-', '');
newaspare = newaspare.replace(big, '');
}
big = '----------------------GETME';
stuffs = newaspare.split('/');
if (dnprefix != '') {
admjk[idmjk].download = dnprefix + prestuffs[stuffs.length - 1];
} else {
admjk[idmjk].download = dnprefix + stuffs[stuffs.length - 1];
}
admjk[idmjk].title = "(Really download) " + admjk[idmjk].title + ' ... welcome to the long hover functionality that shows allows for a Download Mode for the blog that can be toggled';
admjk[idmjk].onmouseover = " getDownloadMode(); ";
admjk[idmjk].onmouseout = " yehBut(); ";
admjk[idmjk].ontouchstart = " getDownloadMode(); ";
admjk[idmjk].ontouchend = " yehBut(); ";
}
} else if (admjk[idmjk].href.indexOf('GETME') != -1 && origcafd < 0) { //!cafd) {
xp=admjk[idmjk].href.split("GETME");
prexp=xp[0].split("/");
postprexp=prexp[-1 + prexp.length].split(".");
extis = postprexp[-1 + postprexp.length].replace(/_/g,"").replace(/-/g,"").replace(/GETME/g,"");
outs="//www.rjmprogramming.com.au/getmelist.htm?topoff=150&tsp=" + (Math.floor(Math.random() * 1999900) + 100) + "#" + postprexp[0] + "." + postprexp[-1 + postprexp.length].replace(extis,"").replace(extis,"").replace(extis,"") + "GETME" + extis;
aorig=admjk[idmjk].innerHTML;
selbitis=allthecombos((admjk[idmjk].href + '=').split('=')[1].split('&')[0]);
admjk[idmjk].innerHTML=admjk[idmjk].innerHTML.replace(".","<span data-alt='" + outs + "' id='spn" + cafd + "' title=\" + Code Download Table\" onclick=\"if (cafd == cafd) { cafd=" + cafd + "; changeasfordownload(); } else { window.open('" + outs + "','_blank','top=100,left=100,width=500,height=500'); } return false; \"><select onchange=\" if (this.value.length > 0) { window.open(this.value,'_blank'); } return false; \" style='margin-bottom:0px;width:40px;' id='sel" + cafd + "'><option value=></option>" + selbitis + "</select></span>");
if (aorig == admjk[idmjk].innerHTML && admjk[idmjk].innerHTML.indexOf('er posts') == -1) admjk[idmjk].innerHTML=admjk[idmjk].innerHTML.replace(" ","<span data-alt='" + outs + "' id='spn" + cafd + "' title=\" + Code Download Table\" onclick=\"if (cafd == cafd) { cafd=" + cafd + "; changeasfordownload(); } else { window.open('" + outs + "','_blank','top=100,left=100,width=500,height=500'); } return false; \"><select onchange=\" if (this.value.length > 0) { window.open(this.value,'_blank'); } return false; \" style='margin-bottom:0px;width:40px;' id='sel" + cafd + "'><option value=></option>" + selbitis + "</select></span>");
cafd++;
} else if ((admjk[idmjk].innerHTML.indexOf('live run') != -1 || admjk[idmjk].title.toLowerCase().indexOf('click picture') != -1) && origcafd < 0) { //!cafd) {
outs="//www.rjmprogramming.com.au/slideshow.html#tuts";
admjk[idmjk].innerHTML=admjk[idmjk].innerHTML.replace(" ","<span data-alt='" + outs + "' id='spn" + cafd + "' title=\" + Cut to the Chase ... see the blog post list related to live runs and slideshows ... ie. the main point of the blog posting\" onclick=\"if (cafd == cafd) { cafd=" + cafd + "; changeasfordownload(); } else { window.open('" + outs + "','_blank','top=100,left=100,width=650,height=100'); } return false; \"></span>");
cafd++;
}
}
}
?>
โฆ to, depending on whether the user specifies in the โAll Postsโ togglingโs Javascript prompt window presented, specifies a new comma separated โclient folder of interest to copy toโ place (stored in window.localStorage), will โฆ- download with the GETME to the Downloads folder and copy off to the specified folder of interest (backing up as necessary) โฆ versus โฆ
- the default download mode downloads to the Downloads folder without the GETME parts
See these changes in action below, contextualizing โserverโ and โclientโ codes in the full picture of assisted Downloads (copied on to a folder of the userโs interest) โฆ
Previous relevant Download and Copy or Move Primer Tutorial is shown below.
Downloading from โthe netโ (โserver landโ) to your computer or device (โclient landโ) is a big part of the online experience and the sharing of data over the world wide web. But have you ever wondered about the two step design of โฆ
- download from โthe netโ to a Downloads folder on your computer or device โฆ and more often than not โฆ
- you, the user, copies or renames this data to another location on your computer or device with command line or with operating system GUI
โฆ ? Why not allow the โserverโ side define where it can download to on the โclientโ? Well, that would be a security nightmare, allowing a highjacking of mission critical files on your computer or device. So, I get it, that is a โno noโ. But could we have a controlled โarrangementโ between โฆ
- the โserverโ side web applications/pages โฆ and โฆ
- a โclientโ side listener (like we talked about with Korn Shell listeners with Pandoc Document Conversion Email Tutorial)
โฆ ? We think that sounds reasonable and so, today, we start our (two parts or more) mini-project (making step 2 above be considered to be programmatically handled, sometimes) designing a Korn Shell (โclientโ side) listener to suit our macOS โclientโ computer, executed as a background process via โฆ
ksh download_copierksh &
But what is the conduit, if the โserverโ web applications/pages cannot define a destination folder other than the macOS Downloads folder for the user involved? Well, that is where we need either โฆ
- Korn Shell interactive input (via read command) โฆ or โฆ
- additional argument โฆ as per example โฆ
ksh download_copierksh /Applications/MAMP/htdocs/ &
โฆ if the folder to copy to is known ahead of time
โฆ to define a โclient landโ folder to copy to (from the userโs Download folder (receiving the downloaded data).
That first Korn Shell read command interactive input was interesting to us for a command backgrounded via the โ&โ command suffix. But if stdin and stdout are not mentioned in the command you can answer this interactive input and then the processing the Korn Shell performs proceeds in the background. Exactly what we were hoping for, but werenโt sure that this was the case!
The picture is filled in better tomorrow as we discuss the conduit in more detail tomorrow.
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.