Еще одно типичное использование плавающих фреймов IFRAME заключается в том, чтобы отправлять содержимое формы в фоновом режиме, причем это может быть даже форма выгрузки файла, что в обычном случае влечет за собой полную перезагрузку страницы. Ниже следует сценарий CherryPy, который обслуживает операцию выгрузки файла:
import cherrypy
# определите здесь, куда следует поместить выгружаемый файл
local_file_path="/tmp/uploaded_file"
class Content:
#обслуживает передачу файла...
@cherrypy.expose
def upload(self, inbound):
outfile = open(local_file_path, 'wb')
inbound.file.seek(0)
while True:
data = inbound.file.read(8192)
if not data:
break
outfile.write(data)
outfile.close()
# вернуть в качестве ответа простой файл HTML
return "<html><head></head>Thanks!</html>"
# запустить вебсервер, который прослушивает порт 8080
cherrypy.quickstart(Content(), '/')
А ниже приводится страница HTML, которая выполняет выгрузку. Когда выгрузка файла запускается с помощью IFRAME, она происходит в фоновом режиме, и сама страница при этом не изменяется, но если выгрузка файла инициируется с помощью кнопки отправки фо
мы, происходит переключение страницы. Обратите внимание, что в этом примере параметр запроса handleAs имеет значение "html".
<html>
<head>
<title>Fun with IFRAME Transports!</title>
<script type="text/javascript"
src="http://o.aolcdn.com/dojo/1.1/dojo/dojo.xd.js"
djConfig="isDebug:true,dojoBlankHtmlUrl:’/path/to/blank.html’">
</script>
<script type="text/javascript">
dojo.require("dojo.io.iframe");
dojo.addOnLoad(function() {
upload = function() {
dojo.io.iframe.send({
form : "foo",
handleAs : "html", //тип ответа сервера
url : "http://localhost:8080/upload/",
load : function(response, ioArgs) {
console.log(response, ioArgs);
return response;
},
error : function(response, ioArgs) {
console.log("error");
console.log(response, ioArgs);
return response;
}
});
};
});
</script>
</head>
(body)
<form id="foo" action="http://localhost:8080/upload/" method="post"
enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="inbound">
(br /)
<input type="submit" value="Submit Via The Form">
</form>
(button onclick="javascript:upload();")Submit Via the IFRAME Transport
(/button)
(/body)
</html>