Как движок приложения Google может сообщить о прогрессе при загрузке файла - PullRequest
0 голосов
/ 04 октября 2009

Я пытался использовать компонент загрузки файлов в стиле ajax (например, компонент загрузки файлов dojox) с механизмом приложений Google и имел индикатор выполнения.

Со стороны javascript все хорошо, но мне интересно, как организовать вещи на стороне сервера?

Возможно ли получить доступ к данным во время их загрузки в Google App Engine, возможно, с помощью BaseHTTPServer? Я мог бы тогда опросить это от клиента.

Даже если невозможно было выполнить процесс, по крайней мере, было бы замечательно иметь возможность завершить большой файл и дать пользователю знать, что он слишком большой, не заставляя пользователя загружать 1 МБ (ограничение движка приложения Google ), а затем выяснить, что это было большим.

Есть несколько похожих вопросов: Подобный вопрос переполнения стека 1 , Аналогичный вопрос переполнения стека 2 .

Следующий код Python для движка приложения Google - это просто основной обработчик сообщений для простой загрузки файла (который работает нормально), но я ищу что-то, что работает на более низком уровне. К тому времени, когда обработчик сообщений получит его, файл уже будет загружен.

В стеке LAMP вы можете опрашивать сценарий на стороне сервера, который наблюдает за увеличением размера временного файла. Когда файл перемещается из временной папки, вы знаете, что он завершен. Используя этот метод, вы можете увидеть прогресс нескольких файлов без использования флэш, я не уверен, как сделать то же самое с движком приложения Google.

class fileupload(webapp.RequestHandler):
"""
"""
def post(self):
    if "image" in self.request.arguments():
        content = "<html><body>Error</body></html>"      
        form = self.request.params['image']
        logging.info(form)
        try:
            filename = form.filename
            siz = len(form.value)

            ###--- Show data
            logging.info("Filename: %s" % form.filename)
            logging.info("Size: %s" % siz)

            content = "<html><body>File has been uploaded Name: %s Size: %s</body></html>" % (filename, siz)
            logging.info("DONE")
        except:     
            logging.info("Error: bad form or something like that")

        logging.info("writing out response")
        self.response.out.write(content)

Ответы [ 3 ]

1 голос
/ 04 октября 2009

App Engine не вернет никаких данных из обработчика запроса до тех пор, пока запрос не будет завершен, поэтому любая проверка прогресса должна выполняться на стороне клиента. IIRC ваш запрос даже не будет загружен на сервер приложений, пока загрузка не будет завершена.

1 голос
/ 19 декабря 2010

Это не будет работать для каждого браузера, но это хороший способ сделать несколько загрузок файлов через AJAX:

function upload_files(entityKey, files, url, progress_callback) {
  var xhr = new XMLHttpRequest(), formData = new FormData();
  xhr.upload['onprogress'] = progress_callback;

  formData.append('entityKey', entityKey);
  $.each(files, function(i, file) { formData.append('file[]', file);});

  xhr.open("post", url, true);
  xhr.setRequestHeader("Cache-Control", "no-cache");
  xhr.send(formData);
}

EntityKey является примером параметра на сервере. Параметр 'files' берется из атрибута 'files' элемента формы ввода файлового типа (в виде массива для поддержки нескольких). Параметр progress_callback - это функция, которая принимает объект, имеющий (по крайней мере) поле «загружено» и «общее» (единица измерения - байты). Его не волнует ответ сервера.

1 голос
/ 04 октября 2009

Вы можете ограничить размер файла на клиентском сайте, используя swfupload .

Это флэш-компонент с javascript api, который предоставляет возможности флэш-загрузки. Проверка размера файла производится в браузере клиента. (в функции CheckFileSize )

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...