One challenge that comes up a few times a year for various clients is moving data from a legacy system to a web application. For instance if your billing system or ERP system creates a report that you want to display to your customers online, you may want to send that report to the webapp.
In this case Acme Corp. has a list of product inventory that they want to upload daily from a Windows 2003 server to their handy PHP app online. Let’s write them two applications. One to send the list to the server and one to accept it on the server. We aren’t going to do any fancy processing, that’s a topic for another time, but were at least going to get that file.
The Server
First we need to write a PHP application to accept the file. We are going to somewhat secure about it and at least require a plain text username and password. You can use better security, but this will do. If it is going over the Internet, I’d also suggest you use HTTPS to transport the data
<?
/* Modify these values */
define(USERNAME, "myuser");
define(PASSWORD, "mypass");
define(MYAPP, "Upload101");
define(MYDEST, "data-".date("Ymd").".csv");
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="'.MYAPP.'"');
header('HTTP/1.0 401 Unauthorized');
echo 'You must login to send '.MYAPP.' data.';
exit;
} else {
if($_SERVER['PHP_AUTH_USER'] == USERNAME && $_SERVER['PHP_AUTH_PW'] == PASSWORD)
{
if ($_SERVER['REQUEST_METHOD'] == "PUT")
{
/* PUT data comes in on the stdin stream */
$putdata = fopen("php://input", "r");
/* Open a file for writing */
$fp = fopen(MYDEST, "w");
/* Read the data 1 KB at a time
and write to the file */
while ($data = fread($putdata, 1024))
fwrite($fp, $data);
/* Close the streams */
fclose($fp);
fclose($putdata);
}
else
{
foreach($_FILES as $name=>$val)
{
move_uploaded_file($val['tmp_name'], MYDEST);
chmod($dest, 0664);
}
}
}
else
{
header('WWW-Authenticate: Basic realm="'.MYAPP.'"');
header('HTTP/1.0 401 Unauthorized');
echo 'Invalid credentials';
exit;
}
}
?>
The application above supports both PUT and POST style uploads. VB.Net will generally use the multi-part POST method, but it is good to support both. Make sure to modify the constants at the top of the script based on your needs. Then upload it to your webserver.
The Client
Next write your VB.Net Application, which will login to the web server and send the file.
Imports System.Net
Module MyUpload
Sub Main(ByVal args As String())
Dim argCount As Integer = 0
Dim username, password, filename, url As String
For Each arg As String In args
If (argCount = 0) Then username = arg
If (argCount = 1) Then password = arg
If (argCount = 2) Then filename = arg
If (argCount = 3) Then url = arg
argCount = argCount + 1
Next
If (argCount = 4) Then
Dim instance As WebClient = New WebClient
instance.Credentials = New NetworkCredential(username, password)
instance.UploadFile(url, filename)
Else
Console.WriteLine("Syntax: MyUpload.exe [username] [password] [filename] [url]")
End If
End Sub
End Module
You can download a copy of the MyUpload application:
MyUpload.exe [12kb, MD5 Checksum: 0b2c875e8d05864dd9c81d04624d46ea]
Putting It All Together
You then run MyUpload.exe with the parameters you set in your PHP application for username and password and the URL of your upload script. Note the double backslashes \\ in the filename.
MyUpload.exe myuser mypass c:\\myfile.csv http://www.example.com/myapp/upload.php
You can then add it as a scheduled task to automate the process.