2015-02-23 53 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 

在创建模型创建表单并去后。