〇、知识点

jquery ajax 文档告诉你可以使用默认的 application/x-www-form-urlencoded, multipart/form-data, or text/plain 这三种,其它的也可以,但是需要告诉ajax 的怎样序列化它。——这句话来源于:https://www.cnblogs.com/htoooth/p/7242217.html

一、原生ajax、不使用表单(Form)

app.py

import os
from flask import Flask, request, jsonify, render_template
from werkzeug import secure_filename UPLOAD_FOLDER = 'uploads'
ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif']) app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER def allowed_file(filename):
return '.' in filename and \
filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS @app.route('/')
def index():
return render_template('index.html') @app.route('/uploadfile', methods=['POST'])
def upload_file():
if request.method == 'POST':
print('request.files', dir(request.files))
file = request.files['file']
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
url = os.path.join(app.config['UPLOAD_FOLDER'], filename)
file.save(url)
return jsonify(dict(url=url,)), 201 if __name__ == "__main__":
app.run(debug=True)

index.html

<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="UTF-8">
<title>Flask上传图片演示三</title>
</head>
<body>
<h1>Flask上传本地图片示例三</h1>
<p>不使用表单Form,原生javascript实现ajax,返回上传的图片所保存的位置</p> <input type="file" name="file" />
<br>
<input type="button" value="上传" /> <p id="res"></p>
<script>
var file = document.querySelector('input[type="file"]');
var btn = document.querySelector('input[type="button"]'); //ajax
btn.addEventListener('click', function(event){
event.preventDefault(); var data = new FormData();
data.append(file.name, file.files[0]);var xhr = new XMLHttpRequest();
xhr.open('POST', '/uploadfile', true);
//xhr.setRequestHeader("Content-Type", "multipart\/form-data;"); //千万不能要这一句,否则后台request.files读不到file
xhr.send(data); xhr.addEventListener('loadend', function(){
if(xhr.status == 201){
var res_json = JSON.parse(xhr.responseText);
document.querySelector('#res').innerHTML = "上传的图片保存在:" + res_json.url;
}
}, false);
}, false);
</script>
</body>
</html>

二、原生ajax、使用表单(Form)

app.py

import os
from flask import Flask, request, jsonify, render_template
from werkzeug import secure_filename UPLOAD_FOLDER = 'uploads'
ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif']) app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER def allowed_file(filename):
return '.' in filename and \
filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS @app.route('/')
def index():
return render_template('index.html') @app.route('/uploadfile', methods=['POST'])
def upload_file():
if request.method == 'POST':
file = request.files['file']
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
url = os.path.join(app.config['UPLOAD_FOLDER'], filename)
file.save(url)
return jsonify(dict(url=url,)), 201 if __name__ == "__main__":
app.run(debug=True)

index.html

<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="UTF-8">
<title>Flask上传图片演示二</title>
</head>
<body>
<h1>Flask上传本地图片示例二</h1>
<p>使用表单Form,原生javascript实现ajax,返回上传的图片所保存的位置</p> <!-- <form enctype='multipart/form-data'> 注意:非必须指定enctype='multipart/form-data' -->
<form>
<input type="file" name="file"/>
<br>
<input type="submit" value="上传"/>
</form> <p id="res"></p>
<script>
var form = document.querySelector('form'); //ajax
form.addEventListener('submit', function(event){
event.preventDefault(); var xhr = new XMLHttpRequest();
xhr.open('POST', '/uploadfile', true);
xhr.send(new FormData(form)); //注意:不需要设置Content-Type xhr.addEventListener('loadend', function() {
if(xhr.status == 201){
var res_json = JSON.parse(xhr.responseText);
document.querySelector('#res').innerHTML = "上传的图片保存在:" + res_json.url;
}
}, false);
}, false);
</script>
</body>
</html>

三、无ajax、只使用表单(Form)

app.py

import os
from flask import Flask, request, redirect, url_for, render_template
from werkzeug import secure_filename UPLOAD_FOLDER = 'uploads'
ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif']) app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER def allowed_file(filename):
return '.' in filename and \
filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS @app.route('/')
def index():
return render_template('index.html') @app.route('/uploadfile', methods=['POST'])
def upload_file():
if request.method == 'POST':
file = request.files['file']
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
return redirect(url_for('uploaded_file', filename=filename)) from flask import send_from_directory
@app.route('/uploads/<filename>')
def uploaded_file(filename):
return send_from_directory(app.config['UPLOAD_FOLDER'], filename) if __name__ == "__main__":
app.run(debug=True)

index.html

<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="UTF-8">
<title>Flask上传图片演示一</title>
</head>
<body>
<h1>Flask上传本地图片示例一</h1>
<p>使用表单Form,无javascript,跳转显示上传的图片</p> <form action="/uploadfile" enctype='multipart/form-data' method='POST'> <!-- 注意:三个全指定action, enctype, method -->
<input type="file" name="file" style="margin-top:20px;"/>
<br>
<input type="submit" value="上传" style="margin-top:15px;"/>
</form>
</body>
</html>

四、预览、无Form、原生ajax

index.html

<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="UTF-8">
<title>Flask上传图片演示四</title>
</head>
<body>
<h1>Flask上传本地图片示例四</h1>
<p>上传前预览图片,不使用表单Form,原生ajax,返回上传的图片所保存的位置</p> <img id="base64image" src="" style="max-height:150px;"/>
<br />
<input type="file" name="image" accept="image/gif,image/jpeg,image/jpg,image/png,image/svg"/>
<br />
<input type="button" value="上传"/> <p id="res"></p> <script>
var base64image = document.querySelector('#base64image');
var fileElement = document.querySelector('input[type="file"]');
var btnElement = document.querySelector('input[type="button"]'); //预览
fileElement.addEventListener('change', function(event){
if (!event.target.files || !event.target.files[0]) {
return;
}
var reader = new FileReader();
reader.readAsDataURL(event.target.files[0]); reader.addEventListener("load", function(e){
base64image.src = e.target.result; //base64编码
}, false);
},false); //ajax
btnElement.addEventListener('click', function(event){
event.preventDefault(); var data = new FormData();
data.append(fileElement.name, fileElement.files[0]); //添加图片信息 var xhr = new XMLHttpRequest();
xhr.open("post", "/uploadfile", true);//true即异步
//xhr.setRequestHeader('Content-Type', 'multipart/form-data'); //千万别写这句!!
xhr.send(data); xhr.addEventListener("loadend", function(event){
if(xhr.status == 201){ // 201,去看app.py!!
var res = JSON.parse(xhr.responseText); //接收的是json数据
console.log(res);
}
}, false);
},false);
</script>
</body>
</html>

flask使用原生ajax、不使用表单(Form)上传文件的更多相关文章

  1. Django学习——ajax发送其他请求、上传文件(ajax和form两种方式)、ajax上传json格式、 Django内置序列化(了解)、分页器的使用

    1 ajax发送其他请求 1 写在form表单 submit和button会触发提交 <form action=""> </form> 注释 2 使用inp ...

  2. c# 模拟表单提交,post form 上传文件、大数据内容

    表单提交协议规定:要先将 HTTP 要求的 Content-Type 设为 multipart/form-data,而且要设定一个 boundary 参数,这个参数是由应用程序自行产生,它会用来识别每 ...

  3. c# 模拟表单提交,post form 上传文件、数据内容

    转自:https://www.cnblogs.com/DoNetCShap/p/10696277.html 表单提交协议规定:要先将 HTTP 要求的 Content-Type 设为 multipar ...

  4. Java模拟表单POST上传文件

    JAVA模拟表单POST上传文件 import java.awt.image.BufferedImage;import java.awt.image.ColorModel;import java.io ...

  5. ajax异步上传文件和表单同步上传文件 的区别

    1. 用表单上传文件(以照片为例)-同步上传 html部分代码:这里请求地址index.php <!DOCTYPE html> <html lang="en"&g ...

  6. web 表单方式上传文件方法(不用flash插件)

    原理:使用表单的input type="file"标签,通过ajax提交表单请求,后台获取请求中的文件信息,进行文件保存操作 由于我测试用的做了一个上传文件和上传图片方法,所以我有 ...

  7. 通过form上传文件(php)

    前段代码 <html> <head> <meta http-equiv="Content-Type" content="text/html; ...

  8. 关于form 上传文件时的小问题

    平时的form一般写成这样: <form action=" " method="" id="" name=""&g ...

  9. 关于vue使用form上传文件

    在vue中使用form表单上传文件文件的时候出现了一些问题,获取文件的时候一直返回null, 解决之后又出现发送到后台的file文件后台显示为空,解决源码 <template> <d ...

随机推荐

  1. <解决方法>Centos安装使用Chromedriver

    一.安装Chrome 我安装好Centos系统后,就在网上去找Chrome浏览器的安装方法,使用过yum,rpm都安装不上,会报错,然后询问公司的运维,他给我了个包,然后使用:yum localins ...

  2. <1>Python生成高质量Html文件:Pyh模块+Bootstrap框架

    一,介绍 QQ交流群:585499566 本文的目的是怎么使用Pyh+Bootstrap快速生成简约,大方,清新的Html页面,涉及到的技能:Python小白技能,Pyh会阅读中文文档,Html基础, ...

  3. 算法: 包含min函数的栈

    * @Description 包含min函数的栈* @问题:定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)).* @思路: 1:Stack 类中的p ...

  4. [20181204]低版本toad 9.6直连与ora-12505.txt

    [20181204]低版本toad 9.6直连与ora-12505.txt --//我们生产系统还保留有一台使用AMERICAN_AMERICA.US7ASCII字符集的数据库,这样由于toad新版本 ...

  5. [Hive_add_8] Hive 常用参数配置

    0. 说明 记录 Hive 常用参数的配置 1. 设置本地模式 让 Hive 自动使用 Hadoop 的本地模式运行作业,提升处理性能 适合小文件,一般用于测试 set hive.exec.mode. ...

  6. kafka_2.11-2.0.0_安装部署

    参考博文:kafka 配置文件参数详解 参考博文:Kafka[第一篇]Kafka集群搭建 参考博文:如何为Kafka集群选择合适的Partitions数量 参考博文:Kafka Server.prop ...

  7. C语言 汉诺塔问题

    //凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 汉诺塔是由三根杆子A,B,C组成的.A杆上有n个(n>1)穿孔圆盘,盘的尺寸由下到上依次变小.要求按 ...

  8. Spring的IOC注解开发入门2

    注解方式设置属性的值 在我们IOC基于xml属性注入的方式中有(一般推荐set方法) 构造方法注入普通值:<constructor-arg>的使用 set方法注入普通值:<prope ...

  9. java 发邮件

    //先从oracle 下载mail.jarpackage test; import javax.mail.BodyPart; import javax.mail.Message; import jav ...

  10. 简单理解Vue中的nextTick

    Vue中的nextTick涉及到Vue中DOM的异步更新,感觉很有意思,特意了解了一下.其中关于nextTick的源码涉及到不少知识,很多不太理解,暂且根据自己的一些感悟介绍下nextTick. 一. ...