Latest posts on Как передать на сервер файл через post ( urllib2, post, file upload ) topichttp://python.su/forum/topic/7182/2010-04-20T16:08:53+03:00Веб-технологии :: Web :: Как передать на сервер файл через post ( urllib2, post, file upload )
2010-04-20T16:08:53+03:00Iv_48127Вообщем совсем сырой запрос мне составить не получилось, помог следующий класс<br/><br/> <div class="code"><pre>import itertools<br/>import mimetools<br/>import mimetypes<br/>from cStringIO import StringIO<br/>import urllib<br/>import urllib2<br/><br/>class MultiPartForm(object):<br/> """Accumulate the data to be used when posting a form."""<br/><br/> def __init__(self):<br/> self.form_fields = []<br/> self.files = []<br/> self.boundary = mimetools.choose_boundary()<br/> return<br/><br/> def get_content_type(self):<br/> return 'multipart/form-data; boundary=%s' % self.boundary<br/><br/> def add_field(self, name, value):<br/> """Add a simple field to the form data."""<br/> self.form_fields.append((name, value))<br/> return<br/><br/> def add_file(self, fieldname, filename, fileHandle, mimetype=None):<br/> """Add a file to be uploaded."""<br/> body = fileHandle.read()<br/> if mimetype is None:<br/> mimetype = mimetypes.guess_type(filename)[0] or 'application/octet-stream'<br/> self.files.append((fieldname, filename, mimetype, body))<br/> return<br/><br/> def __str__(self):<br/> """Return a string representing the form data, including attached files."""<br/> # Build a list of lists, each containing "lines" of the<br/> # request. Each part is separated by a boundary string.<br/> # Once the list is built, return a string where each<br/> # line is separated by '\r\n'.<br/> parts = []<br/> part_boundary = '--' + self.boundary<br/><br/> # Add the form fields<br/> parts.extend(<br/> [ part_boundary,<br/> 'Content-Disposition: form-data; name="%s"' % name,<br/> '',<br/> value,<br/> ]<br/> for name, value in self.form_fields<br/> )<br/><br/> # Add the files to upload<br/> parts.extend(<br/> [ part_boundary,<br/> 'Content-Disposition: file; name="%s"; filename="%s"' % \<br/> (field_name, filename),<br/> 'Content-Type: %s' % content_type,<br/> '',<br/> body,<br/> ]<br/> for field_name, filename, content_type, body in self.files<br/> )<br/><br/> # Flatten the list and add closing boundary marker,<br/> # then return CR+LF separated data<br/> flattened = list(itertools.chain(*parts))<br/> flattened.append('--' + self.boundary + '--')<br/> flattened.append('')<br/> return '\r\n'.join(flattened)</pre></div>Следовательно мой запрос (см. первый пост) выглядел так:<br/><br/> <div class="code"><pre> # Create the form with simple fields<br/> form = MultiPartForm()<br/> # заполняем поля<br/> form.add_field('_method', 'put')<br/> form.add_field('authenticity_token', token)<br/> # добавляем файлик (image/gif распознается автоматически)<br/> form.add_file('profile_image[uploaded_data]', 'image.gif',<br/> open("1_bigger3.gif", "rb"))<br/> #заполняем следующие поля<br/> form.add_field('user[name]', 'Nameeees')<br/> form.add_field('user[url]', 'http://bla-bla.ru')<br/> form.add_field('user[location]', 'bla-bla')<br/> form.add_field('user[description]', 'test!')<br/> form.add_field('commit', 'Save')<br/> # формируем запросик<br/> request = urllib2.Request('http://twitter.com/settings/profile')<br/> # правим заголовочек )))<br/> request.add_header('User-agent', 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.13) Gecko/2009073022 Firefox/3.0.13')<br/> request.add_header('Referer', 'http://twitter.com/settings/profile')<br/> # переводим всё наше тело в строку<br/> body = str(form)<br/> # добавляем в хидер инфу о теле запроса<br/> request.add_header('Content-type', form.get_content_type())<br/> request.add_header('Content-length', len(body))<br/> # добавляем в дату тело наше ))<br/> request.add_data(body)<br/><br/>## print<br/>## print 'OUTGOING DATA:'<br/>## print request.get_data()<br/>##<br/>## print<br/>## print 'SERVER RESPONSE:'<br/>## print urllib2.urlopen(request).read()<br/><br/> r = urllib2.urlopen(request).read()</pre></div>чтобы посмотреть как запрос будет выглядеть в “сырую” достаточно выполнить следующий код (и это крайне удобно)<br/><br/><div class="code"><pre>print request.get_data()</pre></div>в моём примере код закомменчен. Рад, если кому нибудь помог с аналогичной проблемой!!! :)
Веб-технологии :: Web :: Как передать на сервер файл через post ( urllib2, post, file upload )
2010-04-20T10:23:30+03:00Александр Кошелев48093<blockquote><em>Iv_</em><br/>Спасибо ))) вопрос решен :)</blockquote>Так напишите как
Веб-технологии :: Web :: Как передать на сервер файл через post ( urllib2, post, file upload )
2010-04-20T08:38:56+03:00Iv_48084Спасибо ))) вопрос решен :)
Веб-технологии :: Web :: Как передать на сервер файл через post ( urllib2, post, file upload )
2010-04-19T12:34:00+03:00Iv_48038меня интересует именно сырой запрос, чтобы я его сам мог конструировать как угодно. Что то пока ничего не нашел по этому поводу :(
Веб-технологии :: Web :: Как передать на сервер файл через post ( urllib2, post, file upload )
2010-04-16T22:01:20+03:00poltergeist47910Есть же поиск по форуму:( <a href="http://python.su/forum/viewtopic.php?id=5274%2C">http://python.su/forum/viewtopic.php?id=5274,</a> не раз уже эта тема поднималась…
Веб-технологии :: Web :: Как передать на сервер файл через post ( urllib2, post, file upload )
2010-04-16T14:33:22+03:00Iv_47878Доброго времени суток.<br/>Как залить файл при помощи urllib2 через пост запрос вместе с другими параметрами? (multipart/form-data)<br/>К примеру - изменить аватар на <a href="http://twitter.com" rel="nofollow">twitter.com</a> ?<br/><br/>когда без файла, то там всё ясно вроде, просто передаешь параметры в словарике, например так:<br/><div class="code"><pre>post = urllib.urlencode({'profile_background_color':'#FF00FF',<br/> 'profile_text_color':'#F00000',<br/> 'profile_link_color':'#FF0000',<br/> 'profile_sidebar_fill_color':'#FFF000',<br/> 'profile_sidebar_border_color':'#FFFF00'})</pre></div>А файл же не передать таким образом?<br/>То бишь мне интересно, как отправить “сырой” запрос, например такого вида:<br/><div class="code"><pre>--разделитель<br/>Content-Disposition: form-data; name="_method"<br/><br/>put<br/>--разделитель<br/>Content-Disposition: form-data; name="authenticity_token"<br/><br/>60006ee9827f3fd786eb07cb6dfda8176d19aa62<br/>--разделитель<br/>Content-Disposition: form-data; name="profile_image[uploaded_data]"; filename="image.gif"<br/>Content-Type: image/gif<br/><br/>тело файла "image.gif"<br/>--разделитель<br/>Content-Disposition: form-data; name="user[name]"<br/><br/>my_name<br/>--разделитель<br/>Content-Disposition: form-data; name="user[location]"<br/><br/><br/>--разделитель<br/>Content-Disposition: form-data; name="user[url]"<br/><br/>http://bla-bla.ru<br/>--разделитель<br/>Content-Disposition: form-data; name="user[description]"<br/><br/><br/>--разделитель<br/>Content-Disposition: form-data; name="commit"<br/><br/>Save<br/>--разделитель</pre></div>Его ведь нельзя просто взять и засунуть как текст в запрос вида <br/><div class="code"><pre>urllib2.Request(host, post, headers)</pre></div>или можно??<br/><br/>Заранее спасибо! :)