Как отправить обычные пары ключ / значение сообщения с загрузкой файла в Android - PullRequest
1 голос
/ 16 августа 2011

У меня есть функция для загрузки фотографий по почте.Я могу загрузить файл нормально, но не уверен, что делать с добавлением большего количества пар ключ / значение в POST, в основном мне нужно получить ключ API и ключ сеанса вместе с данными файла, метод выглядит следующим образом.

public ContainerData submitPhoto(FileInputStream fileInputStream, String sessionKey) {

    try {

        URL url = new URL(API_URL);

        HttpURLConnection conn = null;

        if (url.getProtocol().toLowerCase().equals("https")) {
            trustAllHosts();
            HttpsURLConnection https = (HttpsURLConnection) url.openConnection();
            https.setHostnameVerifier(DO_NOT_VERIFY);
            conn = https;
        } else {
            conn = (HttpURLConnection) url.openConnection();
        }


        String lineEnd = "\r\n";
        String twoHyphens = "--";
        String boundary = "*****";

        // HttpURLConnection conn = (HttpURLConnection)
        // connectURL.openConnection();

        // Allow Inputs
        conn.setDoInput(true);

        // Allow Outputs
        conn.setDoOutput(true);

        // Don't use a cached copy.
        conn.setUseCaches(false);

        // Use a post method.
        conn.setRequestMethod("POST");

        conn.setRequestProperty("Connection", "Keep-Alive");

        conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);

        DataOutputStream dos = new DataOutputStream(conn.getOutputStream());

        dos.writeBytes(twoHyphens + boundary + lineEnd);
        dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\"" + "file.png" + "\"" + lineEnd);
        dos.writeBytes(lineEnd);

        // create a buffer of maximum size

        int bytesAvailable = fileInputStream.available();
        int maxBufferSize = 1028;
        int bufferSize = Math.min(bytesAvailable, maxBufferSize);
        byte[] buffer = new byte[bufferSize];

        // read file and write it into form...

        int bytesRead = fileInputStream.read(buffer, 0, bufferSize);
        while (bytesRead > 0) {
            dos.write(buffer, 0, bufferSize);
            bytesAvailable = fileInputStream.available();
            bufferSize = Math.min(bytesAvailable, maxBufferSize);
            bytesRead = fileInputStream.read(buffer, 0, bufferSize);
            /*
             * dos.writeBytes(lineEnd); dos.writeBytes(twoHyphens + boundary
             * + twoHyphens + lineEnd);
             */
        }

        // send multipart form data necesssary after file data...
        dos.writeBytes(lineEnd);
        dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
        dos.flush();
        // Log.d(TAG, "  dos5: " + dos.toString());
        InputStream is = conn.getInputStream();
        // retrieve the response from server
        int ch;

        StringBuffer b = new StringBuffer();
        while ((ch = is.read()) != -1) {
            b.append((char) ch);
        }
        String stringResponse = b.toString();
        // Log.d(TAG, "http response for upload" + s);
        dos.close();

        Gson gson = new GsonBuilder().serializeNulls().create();
        responseObject = gson.fromJson(stringResponse,ContainerData.class);

        JSONObject data = new JSONObject(stringResponse);
        String dataResponse = data.getString("data");
        responseObject.setDataString(dataResponse);


    } catch (JSONException e) {
        e.printStackTrace();
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return responseObject;

}

1 Ответ

1 голос
/ 16 августа 2011

RFC 1867 определяет формат.По ссылке:

Content-type: multipart/form-data, boundary=AaB03x

--AaB03x
content-disposition: form-data; name="field1"

Joe Blow
--AaB03x
content-disposition: form-data; name="pics"; filename="file1.txt"
Content-Type: text/plain

... contents of file1.txt ...
--AaB03x--

Две дополнительные проблемы с вашим кодом:

1) Я считаю воссоздание буфера на каждой итерации громоздким и медленным.Просто уменьшите его до максимального размера перед циклом и используйте его снова.

2) Кроме того, отправка непосредственно байтов данных может быть рискованной (что, если два байта изображения имеют одинаковое значение, чем ваш разделитель?посоветуйте использовать кодировку base64.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...