【问题标题】:How can I receive file uploaded from android client on python Flask server side如何在 python Flask 服务器端接收从 android 客户端上传的文件
【发布时间】:2012-02-14 20:26:55
【问题描述】:

以下是android端的java代码。它将文件从智能手机上传到 Flask 服务器(基于 Flask 框架构建的 Web 服务器)。在 Flask 服务器端,如何正确接收文件?我工作了几天,但无法弄清楚如何正确地做到这一点。 request.headers 给了我正确的解析头数据,但是 request.data 或 request.stream 不能给我预期的数据。任何帮助将不胜感激!

public void doUpload(String filename)
{
    HttpURLConnection conn = null;
    DataOutputStream os = null;
    DataInputStream inputStream = null;

    String urlServer = "http://216.96.***.***:8000/upload";

    String lineEnd = "\r\n";
    String twoHyphens = "--";
    String boundary =  "*****";
    int bytesRead, bytesAvailable, bufferSize, bytesUploaded = 0;
    byte[] buffer;
    int maxBufferSize = 2*1024*1024;

    String uploadname = filename.substring(23);

    try
    {
        FileInputStream fis = new FileInputStream(new File(filename) );

        URL url = new URL(urlServer);
        conn = (HttpURLConnection) url.openConnection();
        conn.setChunkedStreamingMode(maxBufferSize);

        // POST settings.
        conn.setDoInput(true);
        conn.setDoOutput(true);
        conn.setUseCaches(false);
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Connection", "Keep-Alive");
        conn.setRequestProperty("Content-Type", "multipart/form-data; boundary="+boundary);
        conn.addRequestProperty("username", Username);
        conn.addRequestProperty("password", Password);
        conn.connect();

        os = new DataOutputStream(conn.getOutputStream());
        os.writeBytes(twoHyphens + boundary + lineEnd);
        os.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\"" + uploadname +"\"" + lineEnd);
        os.writeBytes(lineEnd);

        bytesAvailable = fis.available();
        System.out.println("available: " + String.valueOf(bytesAvailable));
        bufferSize = Math.min(bytesAvailable, maxBufferSize);
        buffer = new byte[bufferSize];

        bytesRead = fis.read(buffer, 0, bufferSize);
        bytesUploaded += bytesRead;
        while (bytesRead > 0)
        {
            os.write(buffer, 0, bufferSize);
            bytesAvailable = fis.available();
            bufferSize = Math.min(bytesAvailable, maxBufferSize);
            buffer = new byte[bufferSize];
            bytesRead = fis.read(buffer, 0, bufferSize);
            bytesUploaded += bytesRead;
        }
        System.out.println("uploaded: "+String.valueOf(bytesUploaded));
        os.writeBytes(lineEnd);
        os.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

        // Responses from the server (code and message)
        conn.setConnectTimeout(2000); // allow 2 seconds timeout.
        int rcode = conn.getResponseCode();
        if (rcode == 200) Toast.makeText(getApplicationContext(), "Success!!", Toast.LENGTH_LONG).show();
        else Toast.makeText(getApplicationContext(), "Failed!!", Toast.LENGTH_LONG).show();
        fis.close();
        os.flush();
        os.close();
        Toast.makeText(getApplicationContext(), "Record Uploaded!", Toast.LENGTH_LONG).show();
    }
    catch (Exception ex)
    {
        //ex.printStackTrace();
        //return false;
    }
}
}

我的服务器端代码:

@app.route('/cell_upload', methods=['GET', 'POST'])
def cell_upload():
    """Uploads a new file for the user from cellphone."""
    if request.method == 'POST':
        int_message = 1
        print "Data uploading"
        print request.headers
        logdata = request.stream.readline()
        while(logdata):
            print "uploading"
            print logdata
            logdata = request.stream.readline()
        print "Uploading done"
        return Response(str(int_message), mimetype='text/plain')
    int_message = 0
    return Response(str(int_message), mimetype='text/plain')

【问题讨论】:

  • request.datarequest.stream 是否提供不正确的数据(如果有,它是什么?)或没有数据?客户端或服务器端是否有异常?
  • print request.data 什么也没给我。 print request.stream 给了我类似流对象的地址。但是当我尝试打印 request.stream.readline() 时,我又什么也没得到。客户端或服务器端都没有抱怨任何错误或异常。我想我的服务器端代码有问题。我可能无法正确收到包裹。但是当我打印出 request.headers 时,一切看起来都很好。

标签: android python http flask


【解决方案1】:

我不确定您的确切问题是什么,但我能够通过使用取自 this SO question 的 java(客户端)代码并稍微修改您的烧瓶代码如下:

if request.method == 'POST':
        int_message = 1
        print "Data uploading"
        print request.headers
        for v in request.values:
          print v
        #logdata = request.stream.readline()
        #while(logdata):
        #    print "uploading"
        #    print logdata
        #    logdata = request.stream.readline()
        print "Uploading done"
        return Response(str(int_message), mimetype='text/plain')

我不会认为这是“最终答案”,但希望它能让你朝着正确的方向前进。

【讨论】:

  • 谢谢。你是在安卓还是桌面上安装了java客户端?
  • 桌面,因为它看起来除了你的吐司之外没有任何真正的 android 特定的东西。
【解决方案2】:

将任何文件上传到本地运行的烧瓶服务器的工作代码。您可以使用主机 o.o.o.o 访问服务器,并且同一网络上的任何设备都可以使用您的 LAN IP 地址/网络 IP 地址进行评估

from flask import Flask, render_template, request, url_for, flash 
import os
from werkzeug.utils import secure_filename, redirect

UPLOAD_FOLDER = '/Users/arpansaini/IdeaProjects/SmartHomeGestureControlAppFlaskServer/uploads/'
app = Flask(__name__)

app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER


@app.route('/upload')
def upload_file():
    return render_template('upload.html')


@app.route('/uploader', methods=['GET', 'POST'])
def handle_request():
    if request.method == 'POST':
        if 'file' not in request.files:
            flash('No file part')
            return redirect(request.url)
        f = request.files['file']
        if f:
            f.save(secure_filename(f.filename))
            f.save(os.path.join(app.config['UPLOAD_FOLDER'], f.filename))
            return "Success"
    else:
        return "Welcome to server"


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000, debug=True)

【讨论】:

    猜你喜欢
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-05
    • 2013-08-06
    • 2017-12-29
    • 2012-06-14
    • 1970-01-01
    相关资源
    最近更新 更多