php和javascript不能发布文件到远程服务器,而发布到本地服务器的工作

php和javascript不能发布文件到远程服务器,而发布到本地服务器的工作

问题描述:

我确实有以下页面中的一个正在做拖放和另一个获取文件写入。如果拖放在本地进行,则在远程情况下不会出现问题。php和javascript不能发布文件到远程服务器,而发布到本地服务器的工作

<!DOCTYPE html> 
<html> 
<head> 
    <title> BETA APP HOME PAGE </title> 
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script> 
    <link rel="stylesheet" href="CSS/style.css"> 
</head> 
<body> 
<ul> 
    <li><a class="active" href='demo_upload.php'>demo upload</a></li> 
</ul> 

<div style="margin-left:15%;padding:1px 16px;height:1000px;"> 
<a id="topright" href="#" title="RaspBerry Pi"></a> 
    <h1> DEMO USING FILE UPLOAD</h1> 
<p></p> 


<?php 
if (isset($_POST['STARTSCRIPT'])) 
{ 
$command = escapeshellcmd('sudo python AppPy/cgi-bin/test.py'); 
$output = shell_exec($command); 
echo("on"); 
echo $output; 
} 
if (isset($_POST['STOPSCRIPT'])) 
{ 
shell_exec("sudo python AppPy/cgi-bin/test.py"); 
echo("Off"); 
} 
?> 

<form method="post"> 
<button name="STARTSCRIPT">START SCRIPT</button>&nbsp; 
<button name="STOPSCRIPT">STOP SCRIPT</button><br><br> 
</form> 

<div id="dragandrophandler">Drag & Drop Files Here </div> 
<br><br> 
<div id="status1"></div> 
<script> 
function sendFileToServer(formData,status) 
{ 
    var uploadURL ="http://192.168.56.153/WEBAPP/upload.php"; //Upload URL 
    var extraData ={}; //Extra Data. 
    var jqXHR=$.ajax({ 
      xhr: function() { 
      var xhrobj = $.ajaxSettings.xhr(); 
      if (xhrobj.upload) { 
        xhrobj.upload.addEventListener('progress', function(event) { 
         var percent = 0; 
         var position = event.loaded || event.position; 
         var total = event.total; 
         if (event.lengthComputable) { 
          percent = Math.ceil(position/total * 100); 
         } 
         //Set progress 
         status.setProgress(percent); 
        }, false); 
       } 
      return xhrobj; 
     }, 
    url: uploadURL, 
    type: "POST", 
    contentType:false, 
    processData: false, 
     cache: false, 
     data: formData, 
     success: function(data){ 
      status.setProgress(100); 

      //$("#status1").append("File upload Done<br>");   
     } 
    }); 

    status.setAbort(jqXHR); 
} 

var rowCount=0; 
function createStatusbar(obj) 
{ 
     rowCount++; 
     var row="odd"; 
     if(rowCount %2 ==0) row ="even"; 
     this.statusbar = $("<div class='statusbar "+row+"'></div>"); 
     this.filename = $("<div class='filename'></div>").appendTo(this.statusbar); 
     this.size = $("<div class='filesize'></div>").appendTo(this.statusbar); 
     this.progressBar = $("<div class='progressBar'><div></div></div>").appendTo(this.statusbar); 
     this.abort = $("<div class='abort'>Abort</div>").appendTo(this.statusbar); 
     obj.after(this.statusbar); 

    this.setFileNameSize = function(name,size) 
    { 
     var sizeStr=""; 
     var sizeKB = size/1024; 
     if(parseInt(sizeKB) > 1024) 
     { 
      var sizeMB = sizeKB/1024; 
      sizeStr = sizeMB.toFixed(2)+" MB"; 
     } 
     else 
     { 
      sizeStr = sizeKB.toFixed(2)+" KB"; 
     } 

     this.filename.html(name); 
     this.size.html(sizeStr); 
    } 
    this.setProgress = function(progress) 
    {  
     var progressBarWidth =progress*this.progressBar.width()/ 100; 
     this.progressBar.find('div').animate({ width: progressBarWidth }, 10).html(progress + "% "); 
     if(parseInt(progress) >= 100) 
     { 
      this.abort.hide(); 
     } 
    } 
    this.setAbort = function(jqxhr) 
    { 
     var sb = this.statusbar; 
     this.abort.click(function() 
     { 
      jqxhr.abort(); 
      sb.hide(); 
     }); 
    } 
} 
function handleFileUpload(files,obj) 
{ 
    for (var i = 0; i < files.length; i++) 
    { 
     var fd = new FormData(); 
     fd.append('file', files[i]); 

     var status = new createStatusbar(obj); //Using this we can set progress. 
     status.setFileNameSize(files[i].name,files[i].size); 
     sendFileToServer(fd,status); 

    } 
} 
$(document).ready(function() 
{ 
var obj = $("#dragandrophandler"); 
obj.on('dragenter', function (e) 
{ 
    e.stopPropagation(); 
    e.preventDefault(); 
    $(this).css('border', '2px solid #0B85A1'); 
}); 
obj.on('dragover', function (e) 
{ 
     e.stopPropagation(); 
     e.preventDefault(); 
}); 
obj.on('drop', function (e) 
{ 

     $(this).css('border', '2px dotted #0B85A1'); 
     e.preventDefault(); 
     var files = e.originalEvent.dataTransfer.files; 

     //We need to send dropped files to Server 
     handleFileUpload(files,obj); 
}); 
$(document).on('dragenter', function (e) 
{ 
    e.stopPropagation(); 
    e.preventDefault(); 
}); 
$(document).on('dragover', function (e) 
{ 
    e.stopPropagation(); 
    e.preventDefault(); 
    obj.css('border', '2px dotted #0B85A1'); 
}); 
$(document).on('drop', function (e) 
{ 
    e.stopPropagation(); 
    e.preventDefault(); 
}); 

}); 


</script> 


</div> 
</div> 
<div style="margin-left:15%;padding:1px 16px;height:10px;"> 

</div> 
</body> 
</html> 

我的问题是,当我说明我目前的服务器:

var uploadURL ="http://192.168.56.153/WEBAPP/upload.php" 

它的工作,这一点:

chmod -R 0777 /var/www/html/WEBAPP/ 

这仅仅是为了测试(获得的权利问题车程) ,我从apache访问日志中得到本地服务器的响应:

192.168.56.1 - - [08/Apr/2017:14:07:44 +0200] "POST /WEBAPP/upload.php HTTP/1.1" 200 203 "http://192.168.56.153/WEBAPP/demo_upload.php" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko" 

我的文件正在上传。

但是,当我改变了这个目的地远程:

var uploadURL ="http://192.168.56.154/WEBAPP/upload.php" 

我在远程服务器Apache访问日志此消息:

192.168.56.1 - - [08/Apr/2017:13:44:13 +0200] "OPTIONS /WEBAPP/upload.php HTTP/1.1" 200 203 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko" 

没有文件上传。

的upload.php的文件是相同的两种情况:

<?php 

$ds = DIRECTORY_SEPARATOR; //1 

$storeFolder = 'uploads'; //2 

if (!empty($_FILES)) { 

$tempFile = $_FILES['file']['tmp_name']; //3 

$targetPath = dirname(__FILE__) . $ds. $storeFolder . $ds; //4 

$targetFile = $targetPath. $_FILES['file']['name']; //5 

move_uploaded_file($tempFile,$targetFile); //6 

} 


    ?> 
+0

这是[CORS“预检请求”](https://www.w3.org/TR/cors/#resource-preflight-requests)[相关问题](http://stackoverflow.com/questions/ 1256593 /为什么我得到一个选项请求,而不是一个请求) – segFault

+0

好吧...所以我必须添加这样的内容:contentType:“text/plain”?但如果我想要照片? – MouIdri

您获得,因为CORS的类型选项的请求。加载JavaScript脚本的域必须与请求的域相同。禁止跨境请求,这就是为什么他们经常被转换为OPTIONS请求。

但是,您可以通过设置响应标头Access-Control-Allow-Origin: *来允许跨域请求。详情请参阅HTTP access control (CORS)

+1

就在“ MouIdri

+0

对于说明:正如ghostprmgr所说,转到那里:https:/ /zinoui.c​​om/blog/cross-domain-ajax-request,还有https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS(正如segFault指出的那样)。 – MouIdri