2016-03-01 71 views
1

我试图发展蟒蛇下载邮件附件的Django

邮件客户端,我可以用我的Django的模板安装和显示解析电子邮件正文。

现在我需要下载附件时,我点击附件名称。

我能找到的所有方法都是使用python将文件下载到特定的文件夹。 但我怎么可能将其下载到系统默认的下载文件夹,当我点击文件名上我的浏览器

下面是代码示例我试图

def download_attachment(request): 
    if request.method == 'POST': 
     filename=request.POST.get('filename','') 
     mid=request.POST.get('mid','') 
     mailserver = IMAP_connect("mail.example.com",username, password) 
     if mailserver: 
      mailserver.select('INBOX') 
     result, data = mailserver.uid('fetch', mid, "(RFC822)") 
     if result == 'OK': 
      mail = email.message_from_string(data[0][1]) 
      for part in mail.walk(): 
       if part.get_content_maintype() == 'multipart': 
        continue 
       if part.get('Content-Disposition') is None: 
        continue 
       fileName = part.get_filename() 
       if filename != fileName: 
        continue 
       detach_dir = '.' 
       if 'attachments' not in os.listdir(detach_dir): 
        os.mkdir('attachments') 
       if bool(fileName): 
        filePath = os.path.join(detach_dir, 'attachments', fileName) 
        if not os.path.isfile(filePath) : 
         print fileName 
         fp = open(filePath, 'wb') 
         fp.write(part.get_payload(decode=True)) 
         fp.close() 
    return HttpResponse() 

回答

1

您不能访问的名称系统的django的默认下载文件夹。这取决于用户在他/她的浏览器设置中决定。 可以做的是告诉浏览器通过设置Content-Disposition来将文件作为附件对待,然后它会打开默认为下载文件夹的普通“另存为...”框。

一些Django的代码,使这种情况发生会是什么样子:

response = HttpResponse() 
response['Content-Disposition'] = 'attachment; filename="%s"' % fileName 
return response 

又见this question

+0

你的意思是改变我最后如果循环内容与此??那为什么我们将只有内容配置文件内容?我不想在我的服务器中创建文件的副本,并将其作为响应发送并发送。 – JithPS

+0

是的,您只需要在响应对象中包含要发送的数据。你可以使用'response.write(data)'或者只是在创建响应时传递数据,就像'response = HttpResponse(data)'一样。 –

0

下面的代码的工作非常出色

def download_attachment(request): 
    if request.method == 'GET': 
     filename=request.GET.get('filename','') 
     mid=request.GET.get('mid','') 
     mailserver = IMAP_connect("mail.example.com",username, password) 
     if mailserver: 
      mailserver.select('INBOX') 
     result, data = mailserver.uid('fetch', mid, "(RFC822)") 
     if result == 'OK': 
      mail = email.message_from_string(data[0][1]) 
      for part in mail.walk(): 
       if part.get_content_maintype() == 'multipart': 
        continue 
       if part.get('Content-Disposition') is None: 
        continue 
       fileName = part.get_filename() 
       if filename != fileName: 
        continue 
       if bool(fileName): 
        response = HttpResponse(part.get_payload(decode=True)) 
        response['Content-Disposition'] = 'attachment; filename="%s"' % fileName 
        return response