django结合ajax实现文件上传

django结合ajax实现文件上传
并实现文件作为邮件附件发送
先提供代码 后续有时间进行讲解

html

        <form>
          <div class="fields">
            <div class="field half">
              <label for="name">**姓名</label>
              <input type="text" id="name" />
            </div>
            <div class="field half">
              <label for="email">Email/Tel/QQ</label>
              <input type="text" id="email" />
            </div>
            <div class="field">
              <label for="message">**内容</label>
              <textarea id="message" rows="4"></textarea>
            </div>
            <div class="field half">
              <label for="file">email附件上传</label>
              <input type="file" id="email_file" />
            </div>
          </div>
          <ul class="actions">
            <li><button onclick="send_email()" value="发送邮件" class="primary">发送邮件</li>
            <li><input type="reset" value="重置" /></li>
          </ul>
        </form>

javascript

        var isSendEmail = false
        //发送邮件
        function send_email() {
          if (!isSendEmail) {
            isSendEmail = true;
            if ($("#name").val() != "") {
              if ($("#message").val() != "") {
                var myFormData = new FormData();
                // 2.朝对象中添加普通的键值
                myFormData.append('name', $("#name").val());
                myFormData.append('email', $("#email").val());
                myFormData.append('message', $("#message").val());
                myFormData.append('email_file', $('#email_file')[0].files[0]);
                $.ajax({
                  url: "https://xxx.xxx.xxx/xxx/xxx/",
                  type: "post",
                  contentType: false,  // 不用任何编码 因为formdata对象自带编码 django能够识别该对象
                  processData: false,  // 告诉浏览器不要处理我的数据 直接发就行
                  data: myFormData,
                  success: function (data) {
                    console.log(data);
                    if (data.res_code == 200) {
                      alert(data.msg);
                      isSendEmail = false;
                      window.location.href = 'xxx://xxx.xxx';
                    } else {
                      alert(data.msg);
                      isSendEmail = false;
                      window.location.href = window.location.href;
                    }
                  },
                  error: function () {
                    alert("未知状态 如有需要请重新发送 Unknown status. Please resend if necessary");
                  }
                })
              } else {
                alert("请输入留言内容Please input content!");
              }
            } else {
              alert("请输入联系名Please input name!");
            }
          } else {
            alert("正在发送 请稍后再试 Sending. Please try again later!");
          }
        }

django后端

引入包

import os
import smtplib
import time
from email.mime.multipart import MIMEMultipart

from api import settings
# email 用于构建邮件内容
from email.encoders import encode_base64
from email.header import Header
from email.mime.base import MIMEBase
from email.mime.text import MIMEText

from django.http.response import JsonResponse

发送邮件函数


def send(to_addr, Mail, subject, file_name=None):
    # 发信方的信息:发信邮箱,QQ 邮箱授权码
    from_addr = 'xxx@xxx.com' #发信邮箱
    password = 'xxxxxxxxxxxxxxxxxxx'#通过邮箱服务器获取
    # 收信方邮箱
    # 发信服务器
    smtp_server = 'smtp.qq.com'
    msg = MIMEMultipart()
    # 邮箱正文内容,第一个参数为内容,第二个参数为格式(plain 为纯文本),第三个参数为编码
    Mail = MIMEText(Mail, 'plain', 'utf-8')
    # 邮件头信息
    msg['From'] = Header(from_addr)
    msg['To'] = Header(to_addr)
    msg['Subject'] = Header(subject)
    msg['date'] = time.strftime("%a,%d %b %Y %H:%M:%S %z")
    msg.attach(Mail)

    if file_name is not None:
        # 构造MIMEBase对象做为文件附件内容并附加到根容器
        contype = 'application/octet-stream'
        maintype, subtype = contype.split('/', 1)
        # 读入文件内容并格式化
        data = open(file_name, 'rb')
        file_msg = MIMEBase(maintype, subtype)
        file_msg.set_payload(data.read())
        data.close()
        encode_base64(file_msg)
        # 设置附件头
        basename = os.path.basename(file_name)
        file_msg.add_header('Content-Disposition',
                            'attachment', filename=basename)
        msg.attach(file_msg)

    # 开启发信服务,这里使用的是加密传输
    try:
        server = smtplib.SMTP_SSL(smtp_server)
        server.connect(smtp_server, 465)
        # 登录发信邮箱
        server.login(from_addr, password)
        # 发送邮件
        server.sendmail(from_addr, to_addr, msg.as_string())
        # 关闭服务器
        server.quit()
        return True
    except:
        return False

保存缓存文件函数

# 保存缓存文件
def save_file(file):
    if file is not None:
        file_name = os.path.join(settings.BASE_DIR, 'upload_files', file.name)
        with open(file_name, 'wb')as f:
            # chunks()每次读取数据默认 我64k
            for chunk in file.chunks():
                f.write(chunk)
            f.close()
        return file_name
    else:
        return None

删除缓存文件函数

# 删除缓存文件
def remove_file(file_name):
    if file_name is not None:
        if os.path.exists(file_name):  # 如果文件存在
            os.remove(file_name)
        else:
            print('no such file:%s' % file_name)  # 则返回文件不存在

接口函数

# 接口函数

def blog_contact(request):
    params = request.POST
    name = params.get('name')
    email = params.get('email')
    message = params.get('message')
    Mail = '姓名:' + name + '\n联系方式:' + email + '\n内容:' + message + '\n\n\nsend by ' + name
    to_addr = 'xxxxxx@xxxx.com'
    subject = 'xxxxx'
    email_file = request.FILES.get('email_file')
    file_name = save_file(email_file)
    result = send(to_addr, Mail, subject, file_name=file_name)
    if result:
        remove_file(file_name=file_name)
        if email_file is not None:
            info = {"res_code": 200, 'msg': '包含附件发送成功'}
        else:
            info = {"res_code": 200, 'msg': '无附件发送成功'}
    else:
        if email_file is not None:
            info = {"res_code": 500, 'msg': '包含附件发送失败'}
        else:
            info = {"res_code": 500, 'msg': '无附件发送失败'}
    return JsonResponse(info)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值