возникли проблемы с получением скрипта Python CGI для открытия файла, переданного ему из AJAX - PullRequest
1 голос
/ 27 декабря 2011

В предыдущем посте я пытался загрузить файл на сервер, используя HTML и Javascript. Я столкнулся с несколькими проблемами с моей реализацией, поэтому я выбрал другой подход. У меня есть HTML-форма и скрипт Python в каталоге cgi моего веб-сервера. Вот мой HTML-код ...

<html>
<head>
<script type="text/javascript">
    function loadXMLDoc(){
        var xmlhttp;
        if (window.XMLHttpRequest){
            // code for IE7+, Firefox, Chrome, Opera, Safari
            xmlhttp=new XMLHttpRequest();
        }
        else{
            // code for IE6, IE5 seriously, why do I bother?
            xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
        }
        xmlhttp.onreadystatechange=function(){
            if (xmlhttp.readyState==4 && xmlhttp.status==200){
                    document.getElementById("outputDiv").innerHTML=xmlhttp.responseText;
                }
        }
        var file = document.getElementById('idexample').value;
        xmlhttp.open("GET","/cgi/ajax.py?uploadFile="+file,true);
        xmlhttp.send();
    }
</script>
</head>

<body onload="changeInput()">
<form name = "form_input" enctype="multipart/form-data" method="POST">
    <input type="file" ACCEPT="text/html" name="uploadFile" id="idexample" />
    <button type="button" onclick="loadXMLDoc()">Enter</button>
</form>
<div id="outputDiv"></div>
</body>
</html>

Я использую AJAX, потому что мне пришло в голову, что мой скрипт cgi может занять до нескольких минут, в зависимости от файла, который вводит пользователь. Я пытаюсь получить содержимое файла, переданного в мой CGI-скрипт на python, и распечатать его на странице. Все, что я получаю, это "C: \ fakepath \". То, что я хочу сделать, это получить содержимое файла. Вот мой скрипт cgi ...

#!/usr/bin/python
import cgi

form = cgi.FieldStorage()
print 'Content-Type: text/html\n'
if form.has_key('uploadFile'):
    print str(form['uploadFile'].value)
else:
    print 'no file'

Также я должен использовать

xmlhttp.open("POST","/cgi/ajax.py",true); 

вместо

xmlhttp.open("GET","/cgi/ajax.py?uploadFile="+file,true);

Я пробовал оба, но POST даже не возвращает имя моего файла. Также мне пришло в голову, что я прочитал, что мне могут даже не понадобиться теги в моем скрипте, так как я отправляю эту информацию, используя javascript. Это правда. Моя страница работает без тегов формы (по крайней мере, в Chrome и Firefox).

1 Ответ

1 голос
/ 24 марта 2012

Если вы изучите переменную file с помощью console.log (), вы заметите, что она содержит только имя файла, а не его содержимое.

var file = document.getElementById('idexample').value;
console.log(file); // Outputs filename

Стандартный способ загрузки файла через AJAX - это использование iframe. Следующий код взят из jquery.extras.js и основан на плагине формы malsup .

<html>
<body>

<form id=input action=/cgi/ajax.py method=post>
    <input type=file name=uploadFile>
    <input type=submit value=Submit>
</form>

<div id=output></div>

<script src='https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js'></script>
<script>
    $.fn.ajaxForm = function(options) {
        options = $.extend({}, {
            onSubmit:function() {},
            onResponse:function(data) {}
        }, options);
        var iframeName = 'ajaxForm', $iframe = $('[name=' + iframeName + ']');
        if (!$iframe.length) {
            $iframe = $('<iframe name=' + iframeName + ' style="display:none">').appendTo('body');
        }
        return $(this).each(function() {
            var $form = $(this);
            $form
                .prop('target', iframeName)
                .prop('enctype', 'multipart/form-data')
                .prop('encoding', 'multipart/form-data')
                .submit(function(e) {
                    options.onSubmit.apply($form[0]);
                    $iframe.one('load', function() {
                        var iframeText = $iframe.contents().find('body').text();
                        options.onResponse.apply($form[0], [iframeText]);
                    });
                });
        });
    };
    $('#input').ajaxForm({
        onResponse:function(data) {
            $('#output').html(data);
        }
    });
</script>

</body>
</html>

Ваш код CGI в порядке. Тем не менее, я настоятельно рекомендую использовать веб-фреймворк, такой как Pyramid или Django для вашего собственного здравомыслия.

#!/usr/bin/python
import cgi

form = cgi.FieldStorage()
print 'Content-Type: text/html\n'
if 'uploadFile' in form and form['uploadFile'].filename:
    print form['uploadFile'].value
else:
    print 'no file'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...