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.