Найти - Пользователи
Полная версия: pycurl: файл не загружается на сайт. Решено!
Начало » Python для новичков » pycurl: файл не загружается на сайт. Решено!
1
Alex_2057
На моем сайте есть обработчик загрузки файла через форму (upload.php):
<html>
<head>
  <title>Result file download</title>
</head>
<body>
<?php
   if($_FILES["filename"]["size"] > 1024*3*1024)
   {
     echo ("Размер файла превышает три мегабайта");
     exit;
   }
   // Проверяем загружен ли файл
   if(is_uploaded_file($_FILES["filename"]["tmp_name"]))
   {
     // Если файл загружен успешно, перемещаем его
     // из временной директории в конечную
     move_uploaded_file($_FILES["filename"]["tmp_name"], "./".$_FILES["filename"]["name"]);
	 echo("File  ");
	 echo $_FILES["filename"]["name"];
	 echo("  loaded successfully!");
   } else {
      echo("Error loading file");
   }
?>
</body>
</html>

Через bash файл загружается нормально:
#/bin/bash
# файл на локальном компьютере:
FILE=~/data.txt
# загрузчик на сервере:
REMOTE_SITE=http/мой_сайт/upload.php
echo "отправляем файл $FILE на удаленный ресурс $REMOTE_SITE"
curl -X POST -F "filename=@$FILE" $REMOTE_SITE

Прочитал мануал по pycurl.
Загрузчик на python:
import pycurl
c = pycurl.Curl()
c.setopt(c.URL, 'http://мой_сайт/upload.php')
c.setopt(c.HTTPPOST, [
    ('fileupload', (
        # upload the contents of this file
        c.FORM_FILE, __file__,
	c.FORM_FILENAME, '/data.txt',
    )),
])
c.perform()
c.close()

Аналогично, как в примере http://pycurl.io/docs/latest/quickstart.html#file-upload
Но файл не закачивается. Выдает сообщение “Error loading file” (из upload.php).
Вывожу _FILES, - он пустой, т.е загрузка не происходит.
В чем может быть ошибка? Права доступа выставлены.
То-же самое, (не закачивается) и на локальный сервер.
Версии:
python 2.7
python-pycurl 7.19.0-5
Прошу помочь, спасибо.
py.user.next
Запусти такой со своей http-ссылкой.
import pycurl
 
c = pycurl.Curl()
 
url = 'http://localhost:12345/cgi-bin/script.py'
 
c.setopt(c.URL, url)
c.setopt(
    c.HTTPPOST,
    [('fileupload', (c.FORM_FILE, '/etc/issue',
                     c.FORM_FILENAME, 'data.txt'))]
)
c.perform()
c.close()
Alex_2057
py.user.next
Запусти такой со своей http-ссылкой.

Запустил, результат тот-же.
Скрипт для localhost выглядит так, это правильно?
А почему c.FORM_FILE, ‘/etc/issue’ ?
import pycurl
 
c = pycurl.Curl()
 
url = 'http://localhost/upload.php'
 
c.setopt(c.URL, url)
c.setopt(
    c.HTTPPOST,
    [('fileupload', (c.FORM_FILE, '/etc/issue',
                     c.FORM_FILENAME, 'data.txt'))]
)
c.perform()
c.close()
py.user.next
Alex_2057
Скрипт для localhost выглядит так, это правильно?
Адрес твоего скрипта там должен быть.

Alex_2057
А почему c.FORM_FILE, ‘/etc/issue’ ?
Потому что этот файл везде есть.

Запусти
nc -l 12345
и посмотри, чем отличаются запросы

import pycurl
 
c = pycurl.Curl()
 
url = 'http://localhost:12345/cgi-bin/script.py'
 
c.setopt(c.URL, url)
c.setopt(
    c.HTTPPOST,
    [('fileupload', (c.FORM_FILE, '/etc/issue'))]
)
c.perform()
c.close()

и

curl -X POST -F "filename=@/etc/issue" http://localhost:12345/cgi-bin/script.py
Alex_2057
py.user.next
Адрес твоего скрипта там должен быть.
Да, скрипт upload.php находится в корне папки www на localhost

Как будет правильно:
py.user.next
url = 'http://localhost:12345/cgi-bin/script.py
или обращение к моему скрипту:
url = 'http://localhost:12345/upload.php'

Alex_2057
Делаю так. В одном окне терминала запускаю netcat:
nc -l 12345
В другом окне последовательно (поочередно)
команду:
curl -X POST -F "filename=@/etc/issue" http://localhost:12345/upload.php
затем скрипт:
import pycurl
 
c = pycurl.Curl()
 
url = 'http://localhost:12345/upload.php'
 
c.setopt(c.URL, url)
c.setopt(
    c.HTTPPOST,
    [('fileupload', (c.FORM_FILE, '/etc/issue'))]
)
c.perform()
c.close()

На первый запрос:
pi@raspberrypi ~ $ nc -l 12345
POST /upload.php HTTP/1.1
User-Agent: curl/7.26.0
Host: localhost:12345
Accept: */*
Content-Length: 229
Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------ffdc1cc9aeb5

------------------------------ffdc1cc9aeb5
Content-Disposition: form-data; name="filename"; filename="issue"
Content-Type: application/octet-stream

Raspbian GNU/Linux 7 \n \l


------------------------------ffdc1cc9aeb5--
На второй запрос:
pi@raspberrypi ~ $ nc -l 12345
POST /upload.php HTTP/1.1
User-Agent: PycURL/7.25.0
Host: localhost:12345
Accept: */*
Content-Length: 231
Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------66f15d0032fd

------------------------------66f15d0032fd
Content-Disposition: form-data; name="fileupload"; filename="issue"
Content-Type: application/octet-stream

Raspbian GNU/Linux 7 \n \l


------------------------------66f15d0032fd--
Результаты практически не отличаются, за исключением значения boundary:
Но в первом случае (если отключить вывод netcat и заменить localhost:12345 на localhost), файл issue заливается, а во втором - нет.
py.user.next
import pycurl
 
c = pycurl.Curl()
 
url = 'http://localhost:12345/upload.php'
 
c.setopt(c.URL, url)
c.setopt(
    c.HTTPPOST,
    [('filename', (c.FORM_FILE, '/etc/issue'))]
)
c.perform()
c.close()
Alex_2057
Изменил.
Получилось!
Ура! Все работает, локально и на сайте.
Возможно в первоисточнике на оф. сайте что-то напутано.

py.user.next
Большое Вам спасибо за помощь! Удачи и успехов!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB