python - 从 iOS 上传 Flask 文件

标签 python ios flask

我正在尝试将音频文件从我的 iOS 应用程序上传到我的 Flask 后端。 POST 请求通过,但我收到一条错误消息“浏览器(或代理)发送了该服务器无法理解的请求。”

我正在查看 flask 文档来执行此操作,但我看不出他们在做什么,那是不同的。

@auth.route('/uploadfile', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        print('post request received')
        file = request.files['file']
        if file and allowed_file(file.filename):
            print('file name is valid and saving')
            filename = secure_filename(file.filename)
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
            return jsonify({'success': 1})
        else:
            print('file failed to save')
            return jsonify({'success': 2})


def allowed_file(filename):
    print('in allowed_file')
    return '.' in filename and \
        filename.rsplit('.', 1)[1] in app.config['AllOWED_EXTENSIONS']

//Config settings
UPLOAD_FOLDER = '/Users/Michael/Desktop/uploads'
ALLOWED_EXTENSIONS = set(['m4a'])

iOS 端

func savePressed(){

    var stringVersion = recordingURL?.path
    let encodedSound = NSFileManager.defaultManager().contentsAtPath(stringVersion!)
    let encodedBase64Sound = encodedSound!.base64EncodedStringWithOptions(nil)
    let dict = ["file": encodedBase64Sound]        
    let urlString = "http://127.0.0.1:5000/auth/uploadfile"
    var request = NSMutableURLRequest(URL: NSURL(string: urlString)!)
    var session = NSURLSession.sharedSession()
    request.HTTPMethod = "Post"
    var err: NSError?
    request.HTTPBody = NSJSONSerialization.dataWithJSONObject(dict as NSDictionary, options: nil, error: &err)
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    request.addValue("application/json", forHTTPHeaderField: "Accept")

    //Completion handler
    var task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in

最佳答案

您正在对您的文件进行 base64 编码,并将其发布到 application/json 类型的 JSON 对象中。 files 仅在发出 multipart/form-data 类型请求时填充。

因此,request.files中没有名为“file”的数据,而是request.json中的base64编码字符串“file”。当您尝试访问不存在的请求集合上的键时,Flask 会引发错误。

您当前的方式可行,您仍然可以将字符串解码回二进制并保存,但您需要生成自己的文件名或单独发送。

from base64 import b64decode
b64_data = request.json['file']  # the base64 encoded string
bin_data = base64decode(b64_data)  # decode it into bytes

# perhaps send the filename as part of the JSON as well, or make one up locally
filename = secure_filename(request.json['filename'])

with open(filename, 'wb') as f:
    f.write(bin_data)  # write the decoded bytes

正确 的解决方案是将帖子制作为multipart/form-data 并将文件放在正文的文件部分。我不知道如何在 iOS 中执行此操作,但绝对应该支持它。这是使用 Python requests 后的样子图书馆。如果您可以在 iOS 中获得等效项,则无需更改 Flask 代码。

with open(recording, 'rb') as f:
    requests.post('http://127.0.0.1:5000/auth/uploadfile', files={'file': f})

关于python - 从 iOS 上传 Flask 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32259832/

相关文章:

ios - 蓝牙 : image transfer between 2 ios devices using CoreBluetooth

ios - 如何将其他参数传递给UITapGestureRecognizer?

python - Flask-RESTful 项目结构

javascript - 以数组形式访问javascript中的python列表

python - 将 HTML 表单值解释为 Flask View 中的列表

python - 如何自动化传递给pandas.read_sql的参数?

python - 在没有显式循环的情况下构建具有多个自定义索引范围的 numpy 数组

ios - iOS 10 中的 AVPlayerItemFailedToPlayToEndTime 在哪里?

从 Chrome 访问端口 8080 上的 Python 服务器时出现 ERR_INVALID_HTTP_RESPONSE

python - 赋值前引用的变量 'cmd_part_1'