Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Загрузка файла на другой сервер средствами iframe (https://javascript.ru/forum/dom-window/28174-zagruzka-fajjla-na-drugojj-server-sredstvami-iframe.html)

lamer 10.05.2012 13:14

Загрузка файла на другой сервер средствами iframe
 
Здравствуйте.
Появилась необходимость загружать файлы на второй сервер принимая их на первом.
т.е. юзер загружает файл на server-1, а файл загружается на server-2

Читал что можно подобное реализовать без перезагрузки страницы методом Remote Scripting используя iframe. Но конкретных примеров с подробным описанием так и не нашел.

Может кто то встречал в инете и может кинуть линк или выложить в топе с подробным описанием ? Думаю полезно было бы не только мне.
Заранее спасибо.

lamer 10.05.2012 17:38

Нашел вариант с использованием iframe, все работает и файлы на другой сервер закачивает.

index.html на первом сервере - server-1.com

<html>
<head>
<meta charset="utf-8">

	<title>Облако тегов</title>
	
	<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type="text/javascript"></script>
	<script type="text/javascript">	
	
		function hideBtn(){
			$('#upload').hide();
			$('#res').html("Идет загрузка файла");
		}
		
		function handleResponse(mes) {
			$('#upload').show();
		    if (mes.errors != null) {
		    	$('#res').html("Возникли ошибки во время загрузки файла: " + mes.errors);
		    }	
		    else {
		    	$('#res').html("Файл " + mes.name + " загружен");	
		    }	
		}
	</script>	
</head>
<body>
<form action="http://server-2.com/uploads/upload.php" method="post" target="hiddenframe" enctype="multipart/form-data" onsubmit="hideBtn();">
<input type="file" id="userfile" name="userfile" />
<input type="submit" name="upload" id="upload" value="Загрузить" />
</form>
<div id="res"></div>
<iframe id="hiddenframe" name="hiddenframe" style="width:0px; height:0px; border:0px"></iframe>

</body>
</html>


Файл upload.php на втором сервере - server-2.com

<?php 

if(isset($_POST['upload'])){
    //Список разрешенных файлов
    $whitelist = array(".gif", ".jpeg", ".png");         
	$data = array();
	$error = true;
	
	//Проверяем разрешение файла
    foreach  ($whitelist as  $item) {
		if(preg_match("/$item\$/i",$_FILES['userfile']['name'])) $error = false;
    }

    //если нет ошибок, грузим файл
    if(!$error) { 
    	   	  
		$folder =  '.../uploads/';//директория в которую будет загружен файл
		
		$uploadedFile =  $folder.basename($_FILES['userfile']['name']);
				
		if(is_uploaded_file($_FILES['userfile']['tmp_name'])){
		
			if(move_uploaded_file($_FILES['userfile']['tmp_name'],$uploadedFile)){
		
		        $data = $_FILES['userfile'];
			}
			else {	
				$data['errors'] = "Во время загрузки файла произошла ошибка";
			}
		}
		else {	
			$data['errors'] = "Файл не  загружен";
		}
    }
    else{
    	
		$data['errors'] = 'Вы загружаете запрещенный тип файла';
    }
    
    
    //Формируем js-файл    
    $res = '<script type="text/javascript">';
    $res .= "var data = new Object;";
    foreach($data as $key => $value){
    	$res .= 'data.'.$key.' = "'.$value.'";';
    }
    $res .= 'window.parent.handleResponse(data);';
    $res .= "</script>";
    
    echo $res;

}
else{
	die("ERROR");
}

?>


Но проблема в том что если передавать файлы на второй сервер то статус загрузки файла так и остается висеть: Идет загрузка файла хотя файл давно загружен на сервер.
т.е. не получается без перезагрузки страницы получить ответ от второго сервера что файл загружен.

Прочел на одном ресурсе:
Цитата:

возникает проблема с Cross-Domain-Request, если вы имеете доступ к скрипту loader.php на другом сервере, то есть возможность правильно заполнить Cross-Origin заголовки и тогда все запуститься само
Читал про crossdomain.xml прописывал заголовки:
<cross-domain-policy>
<allow-access-from domain="*" to-ports="80"/>
</cross-domain-policy>


Все равно так и висит строка Идет загрузка файла

Помогите пожалуйста разобраться.

dmitriymar 10.05.2012 18:34

что мешает организовать взаимодействие на серверной стороне если доступ есть к обоим серверам?

lamer 10.05.2012 18:54

Цитата:

Сообщение от dmitriymar (Сообщение 173594)
что мешает организовать взаимодействие на серверной стороне если доступ есть к обоим серверам?

Серверную часть с server-1.com трогать не льзя, там простейший хост, на нем можно организовывать только клиентскую часть, а серверную на server-2.com

В прицепе то что выложил я выше работает, не возвращается только ответ от сервера, чтоб юзер видел что загрузка завершена.

Можете подсказать решение ?

dmitriymar 10.05.2012 20:42

Цитата:

Сообщение от lamer
Можете подсказать решение ?

да ктож знает что туда разработчика понатыкали


Часовой пояс GMT +3, время: 05:05.