亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 2466 | 回復(fù): 0
打印 上一主題 下一主題

Python Http POST Binary File [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2011-12-21 08:44 |只看該作者 |倒序?yàn)g覽
最近接觸到了上傳圖片的API,所以就學(xué)習(xí)如何使用Python上傳圖片等二進(jìn)制文件。

Python自帶的urllib, urllib2庫并不能很好的解決用戶上傳二進(jìn)制文件的問題,因?yàn)閡rlencode方法默認(rèn)采用的encoding是‘application/x-www-form-urlencoded’格式,當(dāng)我們上傳二進(jìn)制文件的時(shí)候需要將其encode成'multipart/form-data'格式,所以只能借助一些python的擴(kuò)展庫了。

這里介紹兩種方法:1. pycurl 2. poster 另外還有一個(gè)urllib2_file,大家Google學(xué)習(xí)吧。
  • pycurl
  1. import pycurl

  2. pc = pycurl.Curl()
  3. pc.setopt(pycurl.POST, 1) # POST method
  4. pc.setopt(pycurl.URL, 'http://example.com/webservice/upload/') # 上傳的API接口
  5. pc.setopt(pycurl.HTTPPOST, [('file1', (c.FORM_FILE, '/path/to/your/imagefile'))]) # 設(shè)置POST方法的參數(shù)
  6. pc.perform() # Actually do POST request, 文件上傳
  7. pc.close()
  • poster
  1. from poster.encode import multipart_encode
  2. from poster.streaminghttp import register_openers
  3. import urllib2
  4.  
  5. register_openers()

  6. # datagen: 對POST參數(shù)的encode(multipart/form-data)
  7. # headers: 發(fā)起POST請求時(shí)的http header的信息
  8. datagen, headers = multipart_encode({'file':open('/path/to/imagefile', 'rb')})

  9. # Create a Request object
  10. request = urllib2.Request('http://example.com/webservice/upload/', datagen, headers)

  11. # Actually do POST request
  12. response = urllib2.urlopen(request)

  13. print response.read() # 打印服務(wù)器端的回應(yīng)信息

N.B. 其實(shí)上傳文件的過程就是先收集POST參數(shù)數(shù)據(jù),然后將參數(shù)數(shù)據(jù)進(jìn)行multipart/form-data格式化,這樣創(chuàng)建了一個(gè)請求對象,最后對這個(gè)請求進(jìn)行處理(實(shí)際就是真正的文件上傳操作)。

只有上面的代碼片段,演示的效果肯定還不夠形象生動,下面我們就利用Django來做個(gè)小實(shí)驗(yàn)吧。

假如我們的client端腳本采用了poster的代碼片段,稍作修改如下:
  1. from poster.encode import multipart_encode
  2. from poster.streaminghttp import register_openers
  3. import urllib2
  4.  
  5. register_openers()

  6. datagen, headers = multipart_encode({'file':open('/path/to/imagefile', 'rb')})

  7. request = urllib2.Request('http://localhost:8000/web/upload/', datagen, headers)

  8. response = urllib2.urlopen(request)

  9. print response.read()
然后我們在server端配置如下:
  1. Django_Project $> python manage.py startapp web

  2. Django_Project $> cd web

  3. web $> vim urls.py (內(nèi)容見下文)

  4. web $> vim views.py (內(nèi)容見下文)
 
  web $> cd ..

  1. Django_Project $> vim urls.py (內(nèi)容見下文)
N.B. 需要在settings.py文件中的INSTALLED_APP中添加'web'應(yīng)用。
Django_Project.urls.py 內(nèi)容:
  1. from django.conf.urls.defaults import *
  2. ...
  3. urlpatterns = patterns('',
  4.     ...
  5.     (r'web/', include('web.urls')),
  6.     ...
  7. )
Django_Project.web.urls.py 內(nèi)容:
  1. from django.conf.urls.defaults import *

  2. urlpatterns = patterns('',
  3.     (r'upload/', 'web.views.upload'),
  4. )
Django_Project.web.views.py 內(nèi)容:
  1. # Create your views here.
  2. from django.http import HttpResponse
  3. from django.views.decorators.csrf import csrf_exempt
  4.  
  5. @csrf_exempt # 若沒有csrf處理,服務(wù)器會返回403 forbidden錯(cuò)誤
  6. def upload(request):
  7.     for file_name in request.FILES.keys():
  8.         file_obj = request.FILES[file_name]
  9.         destination = open('/path/to/save/imagefile', 'wb+')
  10.         for chunk in file_obj.chunks():
  11.             destination.write(chunk)
  12.         destination.close()

  13. return HttpResponse('All uploaded files have been saved.')
最后運(yùn)行客戶端腳本,成功提示上傳文件已保存,服務(wù)器端會創(chuàng)建用戶上傳的文件。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP