我想知道如何通过创建API服务来上传文件?
class UploadImage(Resource):
def post(self, fname):
file = request.files['file']
if file:
# save image
else:
# return error
return {'False'}
路线
api.add_resource(UploadImage, '/api/uploadimage/<string:fname>')
然后是HTML
<input type="file" name="file">
我在服务器端启用了CORS
我使用angular.js作为前端,ng-upload如果重要,但也可以使用CURL语句!
答案 0 :(得分:12)
以下内容足以保存上传的文件
from flask import Flask
from flask_restful import Resource, Api, reqparse
import werkzeug
class UploadAudio(Resource):
def post(self):
parse = reqparse.RequestParser()
parse.add_argument('file', type=werkzeug.datastructures.FileStorage, location='files')
args = parse.parse_args()
audioFile = args['file']
audioFile.save("your_file_name.jpg")
答案 1 :(得分:7)
以下代码的内容应该会有所帮助。
@app.route('/upload', methods=['GET', 'POST'])
def upload():
if request.method == 'POST':
file = request.files['file']
extension = os.path.splitext(file.filename)[1]
f_name = str(uuid.uuid4()) + extension
file.save(os.path.join(app.config['UPLOAD_FOLDER'], f_name))
return json.dumps({'filename':f_name})
答案 2 :(得分:3)
您可以使用烧瓶中的请求
class UploadImage(Resource):
def post(self, fname):
file = request.files['file']
if file and allowed_file(file.filename):
# From flask uploading tutorial
filename = secure_filename(file.filename)
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
return redirect(url_for('uploaded_file', filename=filename))
else:
# return error
return {'False'}
答案 3 :(得分:0)
from flask import Flask, url_for, send_from_directory, request
import logging, os
from werkzeug import secure_filename
app = Flask(__name__)
file_handler = logging.FileHandler('server.log')
app.logger.addHandler(file_handler)
app.logger.setLevel(logging.INFO)
PROJECT_HOME = os.path.dirname(os.path.realpath(__file__))
UPLOAD_FOLDER = '{}/uploads/'.format(PROJECT_HOME)
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
def create_new_folder(local_dir):
newpath = local_dir
if not os.path.exists(newpath):
os.makedirs(newpath)
return newpath
@app.route('/', methods = ['POST'])
def api_root():
app.logger.info(PROJECT_HOME)
if request.method == 'POST' and request.files['image']:
app.logger.info(app.config['UPLOAD_FOLDER'])
img = request.files['image']
img_name = secure_filename(img.filename)
create_new_folder(app.config['UPLOAD_FOLDER'])
saved_path = os.path.join(app.config['UPLOAD_FOLDER'], img_name)
app.logger.info("saving {}".format(saved_path))
img.save(saved_path)
return send_from_directory(app.config['UPLOAD_FOLDER'],img_name, as_attachment=True)
else:
return "Where is the image?"
if __name__ == '__main__':
app.run(host='0.0.0.0', debug=False)
这里是a link
答案 4 :(得分:0)
以下是一个使用 curl 上传图像并将其保存在本地的简单程序。
from flask import Flask
from flask_restful import Resource, Api, reqparse
import werkzeug
import cv2
import numpy as np
app = Flask(__name__)
api = Api(app)
parser = reqparse.RequestParser()
parser.add_argument('file',
type=werkzeug.datastructures.FileStorage,
location='files',
required=True,
help='provide a file')
class SaveImage(Resource):
def post(self):
args = parser.parse_args()
# read like a stream
stream = args['file'].read()
# convert to numpy array
npimg = np.fromstring(stream, np.uint8)
# convert numpy array to image
img = cv2.imdecode(npimg, cv2.IMREAD_UNCHANGED)
cv2.imwrite("saved_file.jpg", img)
api.add_resource(SaveImage, '/image')
if __name__ == '__main__':
app.run(debug=True)
你可以像这样使用 curl:
curl localhost:port/image -F file=@image_filename.jpg