Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 15, 2016 23:51:41

Alex_2057
Зарегистрирован: 2016-02-15
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

pycurl: файл не загружается на сайт. Решено!

На моем сайте есть обработчик загрузки файла через форму (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
Прошу помочь, спасибо.

Отредактировано Alex_2057 (Фев. 18, 2016 02:25:20)

Офлайн

#2 Фев. 16, 2016 10:07:19

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

pycurl: файл не загружается на сайт. Решено!

Запусти такой со своей 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()



Офлайн

#3 Фев. 16, 2016 12:46:54

Alex_2057
Зарегистрирован: 2016-02-15
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

pycurl: файл не загружается на сайт. Решено!

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()

Отредактировано Alex_2057 (Фев. 16, 2016 13:33:46)

Офлайн

#4 Фев. 16, 2016 15:17:49

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

pycurl: файл не загружается на сайт. Решено!

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



Отредактировано py.user.next (Фев. 16, 2016 15:20:59)

Офлайн

#5 Фев. 16, 2016 17:36:30

Alex_2057
Зарегистрирован: 2016-02-15
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

pycurl: файл не загружается на сайт. Решено!

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 (Фев. 16, 2016 17:37:09)

Офлайн

#6 Фев. 16, 2016 17:59:37

Alex_2057
Зарегистрирован: 2016-02-15
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

pycurl: файл не загружается на сайт. Решено!

Делаю так. В одном окне терминала запускаю 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 заливается, а во втором - нет.

Отредактировано Alex_2057 (Фев. 16, 2016 18:19:18)

Офлайн

#7 Фев. 17, 2016 01:33:11

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

pycurl: файл не загружается на сайт. Решено!

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()



Офлайн

#8 Фев. 17, 2016 14:18:53

Alex_2057
Зарегистрирован: 2016-02-15
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

pycurl: файл не загружается на сайт. Решено!

Изменил.
Получилось!
Ура! Все работает, локально и на сайте.
Возможно в первоисточнике на оф. сайте что-то напутано.

py.user.next
Большое Вам спасибо за помощь! Удачи и успехов!

Отредактировано Alex_2057 (Фев. 17, 2016 14:24:56)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version