Pass parameters to Python script from PHP

I have Plupload installed to upload files to a specific folder on my site. The interface uses upload.php to transfer the files to the upload/ folder, which are renamed to be unique:
[php]<?php
/**

  • upload.php

  • Copyright 2009, Moxiecode Systems AB

  • Released under GPL License.

  • License: http://www.plupload.com/license

  • Contributing: http://www.plupload.com/contributing
    */

    // HTTP headers for no cache etc
    header(“Expires: Mon, 26 Jul 1997 05:00:00 GMT”);
    header(“Last-Modified: " . gmdate(“D, d M Y H:i:s”) . " GMT”);
    header(“Cache-Control: no-store, no-cache, must-revalidate”);
    header(“Cache-Control: post-check=0, pre-check=0”, false);
    header(“Pragma: no-cache”);

    // Settings
    $targetDir = ini_get(“upload/”) . DIRECTORY_SEPARATOR . “plupload”;
    $cleanupTargetDir = false; // Remove old files
    $maxFileAge = 60 * 60; // Temp file age in seconds

    // 5 minutes execution time
    @set_time_limit(5 * 60);

    // Get parameters
    $chunk = isset($_REQUEST[“chunk”]) ? $_REQUEST[“chunk”] : 0;
    $chunks = isset($_REQUEST[“chunks”]) ? $_REQUEST[“chunks”] : 0;
    $fileName = isset($_REQUEST[“name”]) ? $_REQUEST[“name”] : ‘’;

    // Clean the fileName for security reasons
    $fileName = preg_replace(’/[^\w._]+/’, ‘’, $fileName);

    // Make sure the fileName is unique but only if chunking is disabled
    if ($chunks < 2 && file_exists($targetDir . DIRECTORY_SEPARATOR . $fileName)) {
    $ext = strrpos($fileName, ‘.’);
    $fileName_a = substr($fileName, 0, $ext);
    $fileName_b = substr($fileName, $ext);

     $count = 1;
     while (file_exists($targetDir . DIRECTORY_SEPARATOR . $fileName_a . '_' . $count . $fileName_b))
     	$count++;
    
     $fileName = $fileName_a . '_' . $count . $fileName_b;
    

    }

    // Create target dir
    if (!file_exists($targetDir))
    @mkdir($targetDir);

    // Remove old temp files
    if (is_dir($targetDir) && ($dir = opendir($targetDir))) {
    while (($file = readdir($dir)) !== false) {
    $filePath = $targetDir . DIRECTORY_SEPARATOR . $file;

     	// Remove temp files if they are older than the max age
     	if (preg_match('/\\.tmp$/', $file) && (filemtime($filePath) < time() - $maxFileAge))
     		@unlink($filePath);
     }
    
     closedir($dir);
    

    } else
    die(’{“jsonrpc” : “2.0”, “error” : {“code”: 100, “message”: “Failed to open temp directory.”}, “id” : “id”}’);

    // Look for the content type header
    if (isset($_SERVER[“HTTP_CONTENT_TYPE”]))
    $contentType = $_SERVER[“HTTP_CONTENT_TYPE”];

    if (isset($_SERVER[“CONTENT_TYPE”]))
    $contentType = $_SERVER[“CONTENT_TYPE”];

    // Handle non multipart uploads older WebKit versions didn’t support multipart in HTML5
    if (strpos($contentType, “multipart”) !== false) {
    if (isset($_FILES[‘file’][‘tmp_name’]) && is_uploaded_file($_FILES[‘file’][‘tmp_name’])) {
    // Open temp file
    $out = fopen($targetDir . DIRECTORY_SEPARATOR . $fileName, $chunk == 0 ? “wb” : “ab”);
    if ($out) {
    // Read binary input stream and append it to temp file
    $in = fopen($_FILES[‘file’][‘tmp_name’], “rb”);

     		if ($in) {
     			while ($buff = fread($in, 4096))
     				fwrite($out, $buff);
     		} else
     			die('{"jsonrpc" : "2.0", "error" : {"code": 101, "message": "Failed to open input stream."}, "id" : "id"}');
     		fclose($in);
     		fclose($out);
     		@unlink($_FILES['file']['tmp_name']);
     	} else
     		die('{"jsonrpc" : "2.0", "error" : {"code": 102, "message": "Failed to open output stream."}, "id" : "id"}');
     } else
     	die('{"jsonrpc" : "2.0", "error" : {"code": 103, "message": "Failed to move uploaded file."}, "id" : "id"}');
    

    } else {
    // Open temp file
    $out = fopen($targetDir . DIRECTORY_SEPARATOR . $fileName, $chunk == 0 ? “wb” : “ab”);
    if ($out) {
    // Read binary input stream and append it to temp file
    $in = fopen(“php://input”, “rb”);

     	if ($in) {
     		while ($buff = fread($in, 4096))
     			fwrite($out, $buff);
     	} else
     		die('{"jsonrpc" : "2.0", "error" : {"code": 101, "message": "Failed to open input stream."}, "id" : "id"}');
    
     	fclose($in);
     	fclose($out);
     } else
     	die('{"jsonrpc" : "2.0", "error" : {"code": 102, "message": "Failed to open output stream."}, "id" : "id"}');
    

    }

    // Return JSON-RPC response
    die(’{“jsonrpc” : “2.0”, “result” : null, “id” : “id”}’);
    ?>[/php]

I have a Python script I then want run to process the files after upload. It accepts parameters as script.py [command] [file1] [file2] [file3] etc…

Is there an easy way to do this in PHP? There is a possibility that multiple instances of plupload will be transferring files simultaneously, so I’d like each instance to be able to send the specific file names it generates directly to the Python script. The script will be in the same directory as upload.php.

Apologies if I left out anything important. PHP is not my forte.

If I understand correctly, this upload.php script only process part of uploading file (not entire file), so there need to be some ‘signal’ from uploading tool, indicating when operation is completed and file is fully uploaded to the server. Then , you can use the php’s exec() function to run your Python command.

Thanks very much, exec() was exactly what I was looking for!

Sponsor our Newsletter | Privacy Policy | Terms of Service