1

I want the user to upload a file and then a php file checks if it is valid or not. My problem is in running the script_template.py , i used the function exec() to run in command line but it does not return something and i don't understand why. Thanks in advance. I am using xampp.

index.html

<form id="upload" method="post" action="upload.php" enctype="multipart/form-data">
            <div id="drop">
                Drop Here

                <a>Browse</a>
                <input type="file" name="upl" multiple />
            </div>

            <input type="submit" value="Upload Image" name="submit">
        </form>

php file

$allowed = array('png', 'jpg', 'gif','txt','xlsx','xls');


if(isset($_FILES['upl']) && $_FILES['upl']['error'] == 0){


    $extension = pathinfo($_FILES['upl']['name'], PATHINFO_EXTENSION);

    if(!in_array(strtolower($extension), $allowed)){
        echo '{"status":"error"}';
        echo ' <p>The uploaded file extension is incorrect, please try again with the correct file </p>'; 
        exit;
    }


 $x=file_validation ( $_FILES['upl']['tmp_name'] )  ;
echo $x;


    if(move_uploaded_file($_FILES['upl']['tmp_name'], 'uploads/'.$_FILES['upl']['name'])){
        echo '{"status":"success"}';
        exit;
    }
}

echo '{"status":"error"}';
echo 'erro';
exit;



function file_validation($fich) {
    $validation= exec('python script_template.py '.$fich) ;
    echo $validation ;
    }

python file

#!C:\Python27\python.exe
print "Content-Type: text/html\n"

import sys
fich_input= sys.argv[1]  
print fich_input


def header(fich):
    """
    Extracts the header and it's values from tab separated file
    Requires: fich is tab separated file
    Ensures: dic and aux are dictionaries, where aux associates each header to it's order
    and dic associates each header value to the order number.
    """
    input_fil=open(fich,'r')
    contador_linha=0
    lines =input_fil.readlines()
    dic={}
    aux={}
    for line in lines:

        contador_linha+=1
        line_words=line.split('\t')
        if contador_linha==1: #header
            aux_counter=1
            header_len=len(line_words)
            for elem in line_words:
                if elem != '\n':
                    aux[aux_counter]=elem
                    aux_counter+=1


        elif contador_linha==2:#create values for keys in header
            aux_counter=1
            for elem2 in line_words:

                if elem2 != '\n':

                    dic[aux_counter]=[elem2]

                    aux_counter+=1

    return (aux,dic)



def header_value(dic1,dic2):
    """
    joins header and it's value
    Requires: dic1 is aux from header(fich) and dic2 is dic from header(fich)
    Ensures: final_dic is a dictionary which associates eache header to value
    """
    final_dic={}
    header_len=len(dic1.keys())
    for number in range(1,header_len+1):


        final_dic[dic1[number]]=dic2[number]
    return final_dic



def mol_name(final_dic):
    """
    Finds molecule name for just labelling
    Requires: final_dic is a dictionary returned by header_value
    Ensures: string representing molecule name
    """
    return final_dic['Mol_name'] 

def print_info(final_dic):
    """
    prints in the screen all information contained in the file given by researcher
    Requires: final_dic from header_value
    Ensures: information in the screen
    """
    print str(mol_name(final_dic))
    for key in final_dic:
        print key,':',final_dic[key]

    print '\n'



def general_operation(fich):
    """
    Gathers information required to start database operations and if not give an error
    Requires: fich is a Tab separated file, dic12 is 
    Ensures: Crucial information to database operations
    """
    dics=header(fich)

    header_values= header_value(dics[0],dics[1])

    type_file=''
    if len(header_values) < 21 :
           type_file='no_ref'
    else:
           type_file='ref'


    return (type_file,header_values)


print 'yes'
print general_operation(fich_input)       

The python script is running just fine, php simply ignores it.

2
  • All your Python script does is print to console. I wouldn't expect that to return anything to the PHP script calling it. Perhaps you wanted to write to standard output? Commented Feb 3, 2015 at 23:54
  • I tried return general_operation(fich_input) in the end and still does not send anything. I wrote print instead of return to see if anything comes up in the scene but it does not. Commented Feb 4, 2015 at 13:58

2 Answers 2

2

(I'm assuming you're using Windows.)

I think you need to call Python differently. If you run

python http://localhost/bioinformatica/processa_tsv/AJAX_upload/script_template.py

from the command line on your computer, does it work? I'm guessing not, because the first argument to python should be the name of a Python file on the local drive.

Try running something like python C:\path\to\script.py to test the command line you'll put in exec().

Sign up to request clarification or add additional context in comments.

9 Comments

$validation= exec('python script_template.py '.$fich) (note: script_template.py is in the same directory of php file)
Can you try it from the command prompt? You can open the command prompt using Windows+R, type "cmd", press enter. If it works in the command line, it should work in PHP's exec.
If you call var_dump on the result of exec, what does it show?
That might be the correct answer; recall that exec returns the last line of the program output. You can use system to output all program output, or use exec in a more complicated way to put all output in a string. See php.net/manual/en/function.exec.php.
You need to be more specific than "does not work". What do you see? What is the result?
|
0

Solved it, just by editing this part of the code to:

function file_validation($fich) {
 $validation=""
 exec('python script_template.py '.$fich,$validation) ;
    return $validation ;
    }

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.