【问题标题】:Response Code 400, when uploading image to server上传图片到服务器时响应码 400
【发布时间】:2018-07-30 17:06:35
【问题描述】:

我正在尝试在我的 android 应用中上传图像文件,但我收到响应代码 400responseMessage = null。 API 接受 image file 和一个额外的字段作为 POST 消息。

以下是我的代码:

public String sendPostRequest(String requestURL,
                              HashMap<String, String> postDataParams) {

    URL url;

    StringBuilder sb = new StringBuilder();
    try {
        url = new URL(requestURL);

        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setReadTimeout(15000);
        conn.setConnectTimeout(15000);
        conn.setRequestMethod("POST");
        conn.setDoInput(true);
        conn.setDoOutput(true);


        OutputStream os = conn.getOutputStream();
        BufferedWriter writer = new BufferedWriter(
                new OutputStreamWriter(os, "UTF-8"));
        writer.write(getPostDataString(postDataParams));

        writer.flush();
        writer.close();
        os.close();
        int responseCode = conn.getResponseCode();

        if (responseCode == HttpsURLConnection.HTTP_OK) {
            BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            sb = new StringBuilder();
            String response;
            while ((response = br.readLine()) != null){
                sb.append(response);
            }
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
    return sb.toString();
}

编辑

我上面的函数是在文件 RequestHandler 中定义的,它是从 Activity 调用的,如下所示:

public void uploadImage(){

    final String text = editText.getText().toString().trim();
    final String image = getStringImage(bitmap);
    class UploadImage extends AsyncTask<Void,Void,String> {
        ProgressDialog loading;
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            loading = ProgressDialog.show(FileUploadActivity.this,"Please wait...","uploading",false,false);
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            loading.dismiss();
            Toast.makeText(FileUploadActivity.this,s,Toast.LENGTH_LONG).show();
        }

        @Override
        protected String doInBackground(Void... params) {
            RequestHandler rh = new RequestHandler();
            HashMap<String,String> param = new HashMap<String,String>();
            param.put(KEY_TEXT,text);
            param.put(KEY_IMAGE,image);
            String result = rh.sendPostRequest(UPLOAD_URL, param);
            return result;
        }
    }
    UploadImage u = new UploadImage();
    u.execute();
}

编辑2: 以下函数也是 RequestHandler 的一部分

private String getPostDataString(HashMap<String, String> params) throws UnsupportedEncodingException {
    StringBuilder result = new StringBuilder();
    boolean first = true;
    for (Map.Entry<String, String> entry : params.entrySet()) {
        if (first)
            first = false;
        else
            result.append("&");

        result.append(URLEncoder.encode(entry.getKey(), "UTF-8"));
        result.append("=");
        result.append(URLEncoder.encode(entry.getValue(), "UTF-8"));
    }

    return result.toString();
}

【问题讨论】:

    标签: android file-upload


    【解决方案1】:

    Http 400 的意思是“错误的请求。服务器无法理解请求......”所以首先你应该展示你如何在 getPostDataString() 函数中编写请求。

    我敢打赌,您没有使用多部分表单数据。看到这个SO answer

    【讨论】:

    • 我已经更新了我的问题并添加了调用此方法的功能
    【解决方案2】:

    我还不能发表评论,所以我像回答一样提供它。这是一个奇怪的 API。你确定你理解正确吗?您使用 POST 方法,但不提供 Content Type。这既不是 JSON 也不是 XML。这是格式类似于 URL 请求的纯字符串。服务器返回 400 我并不感到惊讶。检查 API 说明。

    【讨论】:

    • 当我使用 POSTMAN 测试 api 时,它返回了成功的 json
    • 能否提供POSTMAN生成的请求代码?
    • 我相信POSTMAN中的请求被执行了,但我很怀疑它和应用程序中的一样。
    • 嗨弗拉基米尔,我只在正文中创建了一个带有 2 个参数的发布请求。一张有图片,一张有文字。
    • 检查你在 POSTMAN 中设置了什么内容类型
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-01
    相关资源
    最近更新 更多