七牛form表单上传文件

本文介绍了一种使用Vue.js进行图片上传的方法,通过调用七牛云API获取上传凭证并实现多文件批量上传。文章提供了完整的代码示例,包括获取token及上传逻辑。
import Vue from 'vue'
//向服务器获取七牛token,这应该用promiss,待优化
function qiniuToken(cb) {
  Vue.http.get("common/get_qiniu_token.do").then(data => {
    cb(data.body)
  })
}
/**
 * @param {*} f  input文件数组  这应该传入form表单待优化
 * @param {*} token  token
 * @param {*} key  用来设置上传文件名称,不传会用图片md5
 * @param {*} cb 回调
 */
function imgUpdate(f, token, key, cb) {
  let _arr = []
  for (let i = 0; i < f.length; i++) {
    update(f[i], token, key, function (res) {
      _arr.push(res);
      if (_arr.length == f.length) {
        cb(_arr)
      }
    })
  }
}

function update(f, token, key, cb) {
  console.log(f)
  var Qiniu_UploadUrl = "http://up-z2.qiniu.com";
  var xhr = new XMLHttpRequest();
  xhr.open('POST', Qiniu_UploadUrl, true);
  var formData, startDate;
  formData = new FormData();
  if (key !== null && key !== undefined && key !== '') {
    formData.append('key', key)
  };
  formData.append('token', token);
  formData.append('file', f);
  var taking;
  xhr.onreadystatechange = function (response) {
    console.log(xhr)
    if (xhr.readyState == 4 && xhr.status == 200 && xhr.responseText != "") {
      var blkRet = JSON.parse(xhr.responseText);
      if (cb) {
        cb(blkRet)
      }
    }
  };
  xhr.send(formData);
}
export {
  qiniuToken,
  imgUpdate
}
在 HTML 的 form 表单上传文件时,出于安全考虑,现代浏览器不允许直接获取文件的本地绝对路径。不过可以通过服务器端代码来处理文件上传并获取文件在服务器端存储的绝对路径。以下以 Flask 框架为例进行说明。 首先,需要创建表单验证类。新建 `form.py` 文件用于表单验证: ```python from wtforms import Form, FileField from flask_wtf.file import FileRequired, FileAllowed class UploadForm(Form): file = FileField(validators=[FileRequired(), FileAllowed(['jpg', 'png', 'gif'])]) ``` 上述代码定义了一个表单验证类 `UploadForm`,用于验证上传文件是否符合要求,要求文件必须存在且文件类型为 `jpg`、`png` 或 `gif` [^1]。 接着,创建 Flask 应用来处理文件上传: ```python from flask import Flask, request, render_template_string from form import UploadForm import os app = Flask(__name__) @app.route('/upload', methods=['GET', 'POST']) def upload(): if request.method == 'POST': form = UploadForm(request.files) if form.validate(): file = request.files['file'] # 获取项目的绝对路径 base_path = os.path.abspath(os.path.dirname(__file__)) # 定义上传文件的存储目录 upload_path = os.path.join(base_path, 'uploads') if not os.path.exists(upload_path): os.makedirs(upload_path) # 获取文件的完整存储路径 file_path = os.path.join(upload_path, file.filename) # 保存文件 file.save(file_path) return f"文件已成功上传到 {file_path}" else: return "文件上传失败,请检查文件类型" return ''' <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>文件上传</title> </head> <body> <form action="/upload" method="post" enctype="multipart/form-data"> <input type="file" name="file"> <input type="submit" value="上传"> </form> </body> </html> ''' if __name__ == '__main__': app.run(debug=True) ``` 在上述代码中,首先导入必要的模块,然后创建 Flask 应用。定义 `/upload` 路由,当请求方法为 `POST` 时,对上传文件进行验证,如果验证通过,获取项目的绝对路径,创建上传文件的存储目录,将文件保存到指定目录,并返回文件在服务器端的绝对路径。当请求方法为 `GET` 时,返回一个包含文件上传表单的 HTML 页面。需要注意的是,表单中 `enctype="multipart/form-data"` 是必须的,因为默认的编码格式 `application/x-www-form-urlencoded` 不能用于文件上传,只有使用 `multipart/form-data` 才能完整地传递文件数据 [^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值