2015-02-23 79 views
0

我正在嘗試通過http post請求上傳文件的django項目。通過http處理上傳文件的python腳本

我上傳的腳本是:

url=r'http://MYSITEURL:8000/upload' 
files={'file':open('1.png','rb')} 
r=requests.post(url,files=files) 

我的接收方是在我的Django的網站,在views.py:

def upload_image(request): 
from py_utils import open_py_shell;open_py_shell.open_py_shell() 

當我這樣做request.FILES我可以看到所有的細節後, 我想知道的是如何將它保存在服務器端,一旦我得到了後的請求

+0

看起來您已經解決了'上傳文件的腳本',並且您正在嘗試解決'處理上傳的文件'。你應該改變你的頭銜。 – Joe 2015-02-23 09:41:50

回答

1

你在request.FILES有什麼是InMemoryUploadedFile 。你只需要將它保存在文件系統的某個地方。

這是Django docs採取例如方法:

def handle_uploaded_file(f): 
    with open('some/file/name.txt', 'wb+') as destination: 
     for chunk in f.chunks(): 
      destination.write(chunk) 
+0

目前還不清楚爲什麼使用'+'文件模式(目標是隻寫) - 是否與權限相關的黑客?目前還不清楚爲什麼不使用'shutil.copyfileobj(f,destination)'。 – jfs 2015-02-23 12:07:22

0

我認爲你可以用模型很好地工作。這將是Django的正確方法。下面是一個例子,models.py文件:

from django.db import models 
from django.conf import settings 

import os 
import hashlib 


def instanced_file(instance, filename): 
    splitted_name = filename.split('.') 
    extension = splitted_name[-1] 
    return os.path.join('files', hashlib.md5(str(instance.id).encode('UTF-8')).hexdigest() + '.' + extension) 

class File(models.Model): 
    name = models.FileField('File', upload_to = instanced_file) 

    def get_file_url(self): 
     return '%s%s' % (settings.MEDIA_URL, self.name) 

    def __str__(self): 
     return self.name 

    def __unicode__(self): 
     return self.name 

在創建模型創建表單並去後。