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.
-
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?dylrei– dylrei2015年02月03日 23:54:11 +00:00Commented 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.João Pedro– João Pedro2015年02月04日 13:58:50 +00:00Commented Feb 4, 2015 at 13:58
2 Answers 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().
9 Comments
exec.var_dump on the result of exec, what does it show?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.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 ;
}