#### Do you have a question? Post it now! No Registration Necessary.  Now with pictures!

•  Subject
• Author
• Posted on
I work for an animal hospital trying to use PHP to store an animal's
dental x-rays to a file server.

I can browse for the xray on the local desktop computer then click
"Upload  Image". This works fine. The doctors want fewer steps to
follow. So, it was asked if I can configure the browser to load/submit
the doctor/animal technician having to look for for dental x-ray
image.

Does PHP support such a feature to pull/load a file of the client's
computer? My three PHP books aren't helping, but I am probably looking
in the wrong direction.

Thanks.

Steve

## Re: automated upload with PHP

sure, you can script on the client using what is called active
scripting.
its nice and familiar, so you would either
uploaded from a set of folders
2) configure explorer so you can right click and select upload image,
your php script would be run in the bvackground with argument such as
c:\path\to\php -r "%1"
and it would do the rest.
Why not use FTP if you are scripting this, as it will be nice and
robust and can interact is a predicatable way with your fileserver -
providing it can have an ftp serve running on it, like filezilla
server.

## Re: automated upload with PHP

oops I should have added, that if you have a few computers you need to
install this on you could use NSIS (Nullsoft Scriptable Install
System) http://nsis.sourceforge.net/Main_Page to wrap up everything
including the script that makes the right click functionality between
tiffs and the php script, and distribute that.

## Re: automated upload with PHP

Thanks for your help (and the link). I am not familar with
implementing
FTP through PHP. It's mainly PHP with HTML forms. The PHP app runs on
a
Linux box (hopefully this does not matter) and I believe it also has
ftp access. At this point, there will only be one computer that the
PHP application will need to automatically load
the TIF image. The file will be saved in a directory called xrays off
of the C:\
drive.

Steve

## Re: automated upload with PHP

Hi Steve -
Would it suit your requirement to hard code the path into the file
upload box?  The user still has to click "upload" but will not have to
find the file each time.

Aerik

## Re: automated upload with PHP

active scripting is slightly different, it will run on the windows box
where the tiffs are. php on the linux server isnt used at all. I
thought you question was really about "automatic form submission" but
this isnt allowed for security, so you have to program on the client
computer itself. You can do this in any language of course, and
because you seemed familiar with php, I just thought why not use php
on the client too.
For instance, my desktop here does a whole load of things at night,
all using php. It scans direcories and uploads files to an ftp server,
backs stuff up, copies files, and logs the results.

What I would do is
b) set it to automatically run a program (like copy blah to network
drive blah) which uploads the changes
c) write a small program that takes a path and filename and uploads it
to the linux machine over ftp, or if you script using c#, you can just
copy the file there using a mapped drive and samba.

You dont need your users to interact with this process. It is done
automatically. If the images need to get to the file server in real
time, then you can use the watcher, otherwise you can run cronw 2
(sourceforge) to sweep them all there at night.

The reason I keep steering away from http uploads is because they tend
not to be as robust as ftp. FTP can support resume, and other nice
features like compression, (if your code does). You can though script
an automatic form upload using c# or php or whatever, which is just a
script - rather than one that runs in a browser. If you like c#
or .NET check out codeproject for more.

## Re: automated upload with PHP

Mono). While I am not new to PHP, I humblely admit my coding skills
are novice-like. I program enough to fix the program for the first-
stage before my boss has me on some other I.T-related project.

Thanks again.

Steve

## Re: automated upload with PHP

Aerik,

Hard-coding would solve this since the file name would be
the same each time, I could change the name of the
grab the image locally. How would you hard-code the location?

In my example, the xray will be stored in c:\xrays_images and the file
will be called xray.tif.

Thanks for the feedback.

Steve

## Re: automated upload with PHP

file value attribute is read only.
Assuming you don't want to pay for an Active-X component, the only way
to do this programmatically is to alter the security settings of
Firefox, and make sure your users know to always use FF.
(you could force that using
<!--[if IE 5]>
<SCRIPT LANGUAGE="Javascript">
</SCRIPT>
<P>Firefox is safer and just plain better!</P>
<![endif]-->

Now courtesy of http://www.captain.at/ajax-file-upload.php here is the
method:
type about:config and hit enter, type applets in the filter field,
then double click
signed.applets.codebase_principal_support so it is set to true.
(when you run the code ON THE PRODUCTION DOMAIN you see a pop up
allowing you to derestrict the security for this domain, when you are
happy check the remember my answer and allow to prevent your users
seeing the pop up)
You understand I wouldn't go this way at all, because while you own
and run the domain, this is JUST the kind of setting that someone who
uses XSS to gain entry to your intranet needs to completely won half

you've already got a php script that will take the upload but here it
is anyway reproduced from the site above: (it isn't particularly
secure)

<?php
print_r($_FILES); ?> <hr> <?php print_r($_POST);

//this will cause the file to appear when uploaded,
//in the same folder as this post.php php script
$fpath = dirname(__FILE__).'/'; //or use$fpath = '/path/to/upload/directory/';

// move (actually just rename) the temporary file to the real name
move_uploaded_file ( $_FILES,$fpath.$_FILES ); // convert the uploaded file back to binary // javascript "escape" does not encode the plus sign "+", but "urldecode" // in PHP make a space " ". So replace any "+" in the file with %2B first$filename = $fpath.$_FILES;
$handle = fopen($filename, "r");
$contents = fread($handle, filesize($filename)); fclose($handle);

$contents = preg_replace("/\+/", "%2B",$contents);

$handle = fopen($filename, "w");
fwrite($handle, urldecode($contents));
fclose(\$handle);

?>

and here is the html markup with script, some lines will be broken,
but go through it and check, and if you cant get it working email me,
and I'll send you the file.
Note I have changed a line at the top to get the filename
automatically, instead of from the form field, you now dont need the
file input field markup to be visible to the user of course (although
you might still need it to be present - I havent checked through the
js code)

as already said you will gt a warning, allow and then allow again, and
it should work, it posts to post.php by default, in the first instance
set it up to test using the file included in this post, I tested it
just now and it works just fine

<html>
<body>
<script>
var url = "post.php";
var binary;
var filename;
var mytext;

//here is how you could take the value from the form allowing your
users to browse first
//filename = ////document.getElementById('myfile').value;

//but hey you want it to be AUTOMATIC, I was surprised it only had one
f in tif.
filename = 'C:\xrays_images\xray.tif';

mytext = document.getElementById('mytext').value;
document.getElementById('ajaxbutton').disabled = true;

// request local file read permission
try {

netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
} catch (e) {
}

// open the local file
var file = Components.classes["@mozilla.org/file/local;
1"].createInstance(Components.interfaces.nsILocalFile);
file.initWithPath( filename );
stream = Components.classes["@mozilla.org/network/file-input-stream;
1"].createInstance(Components.interfaces.nsIFileInputStream);
stream.init(file,    0x01, 00004, null);
var bstream =  Components.classes["@mozilla.org/network/buffered-
input-stream;1"].getService();
bstream.QueryInterface(Components.interfaces.nsIBufferedInputStream);
bstream.init(stream, 1000);
bstream.QueryInterface(Components.interfaces.nsIInputStream);
binary = Components.classes["@mozilla.org/binaryinputstream;
1"].createInstance(Components.interfaces.nsIBinaryInputStream);
binary.setInputStream (stream);

// start AJAX file upload in 1 second
}

// request more permissions
try {

netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
} catch (e) {
}

http_request = false;
http_request = new XMLHttpRequest();
if (!http_request) {
return false;
}

// prepare the MIME POST data
var boundaryString = 'capitano';
var boundary = '--' + boundaryString;
var requestbody = boundary + '\n'
+ 'Content-Disposition: form-data; name="mytext"' + '\n'
+ '\n'
+ mytext + '\n'
+ '\n'
+ boundary + '\n'
+ 'Content-Disposition: form-data; name="myfile"; filename="'
+ filename + '"' + '\n'
+ 'Content-Type: application/octet-stream' + '\n'
+ '\n'
+ '\n'
+ boundary;

document.getElementById('sizespan').innerHTML = "requestbody.length="
+ requestbody.length;

// do the AJAX request
http_request.open('POST', url, true);
boundary=\"" + boundaryString + "\"");
http_request.send(requestbody);

}

function requestdone() {
if (http_request.status == 200) {
result = http_request.responseText;
document.getElementById('myspan').innerHTML = result;
} else {
alert('There was a problem with the request.');
}
document.getElementById('ajaxbutton').disabled = false;
}
}

</script>

<form>
Text: <input type="text" id="mytext" name="mytext" size="40">
<br>
File: <input type="file" id="myfile" name="datafile" size="40"><br>
<input type="button" id="ajaxbutton" value="AJAX IT"
</form>

<div id="sizespan"></div>
<hr>
<div id="myspan"></div>

</body>
</html>

NOW do you wish you had done the other thing!!

## Re: automated upload with PHP

Oh crud.  Sure is.  Can't find any workarounds either... sorry about
that.