在发送表单数据(android)

时间:2018-08-26 06:53:01

标签: android

一天中的其他时间,我需要发送数据方面的帮助,我是android的新手,我还不了解所有内容。无论如何,我不能将Post请求发送到multipart / form-data。 试图这样做:

public class FilesUploadingTask2 extends AsyncTask<Void, Void, String> {

    // Конец строки
    private String lineEnd = "\r\n";
    // Два тире
    private String twoHyphens = "--";
    // Разделитель
    private String boundary =  "----WebKitFormBoundaryefkgxHeaEjv3FGL7";

    // Переменные для считывания файла в оперативную память
    private int bytesRead, bytesAvailable, bufferSize;
    private byte[] buffer;
    private int maxBufferSize = 1*1024*1024;

    // Путь к файлу в памяти устройства
    private String filePath;
    private JSONObject JsonToSend;
    // Адрес метода api для загрузки файла на сервер
    public final String API_FILES_UPLOADING_PATH = globalvariables.globURL + "/api/v1/shares/report/";

    // Ключ, под которым файл передается на сервер
    public static final String FORM_FILE_NAME = "photos";

    public FilesUploadingTask2(String filePath, JSONObject js) {
        this.filePath = filePath;
        this.JsonToSend = js;
    }
    public void addFormField(BufferedWriter dos, String parameter, String value){
        try {
            dos.write(twoHyphens + boundary + lineEnd);
            dos.write("Content-Disposition: form-data; name=\""+parameter+"\"" + lineEnd);
            dos.write("Content-Type: text/plain; charset=UTF-8" + lineEnd);
            dos.write(lineEnd);
            dos.write(value + lineEnd);
            dos.flush();
        }
        catch(Exception e){

        }
    }
    public void addFormField2(BufferedWriter dos, String parameter, int value){
        try {
            dos.write(twoHyphens + boundary + lineEnd);
            dos.write("Content-Disposition: form-data; name=\""+parameter+"\"" + lineEnd);
            dos.write("Content-Type: text/plain; charset=UTF-8" + lineEnd);
            dos.write(lineEnd);
            dos.write(value + lineEnd);
            dos.flush();
        }
        catch(Exception e){

        }
    }
    public void addFormField3(BufferedWriter dos, String parameter){
        try {
            dos.write(twoHyphens + boundary + lineEnd);
            dos.write("Content-Disposition: form-data; name=\""+parameter+"\"" + lineEnd);
            dos.write("Content-Type: text/plain; charset=UTF-8" + lineEnd);
            dos.write(lineEnd);
            dos.write(null + lineEnd);
            dos.flush();
        }
        catch(Exception e){

        }
    }
    @Override
    protected String doInBackground(Void... params) {
        // Результат выполнения запроса, полученный от сервера
        String result = null;

        try {
            // Создание ссылки для отправки файла
            URL uploadUrl = new URL(API_FILES_UPLOADING_PATH);

            // Создание соединения для отправки файла
            HttpURLConnection connection = (HttpURLConnection) uploadUrl.openConnection();

            // Разрешение ввода соединению
            connection.setDoInput(true);
            // Разрешение вывода соединению
            connection.setDoOutput(true);
            // Отключение кеширования
            connection.setUseCaches(false);

            // Задание запросу типа POST
            connection.setRequestMethod("POST");

            // Задание необходимых свойств запросу
            connection.setRequestProperty("Authorization", "token " + globalvariables.ClientToken);
            connection.setRequestProperty("Connection", "Keep-Alive");
            connection.setRequestProperty("Content-Type", "multipart/form-data;boundary="+boundary);
            connection.setRequestProperty("Accept","application/json");

            // Создание потока для записи в соединение
            DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream());
            BufferedWriter outputStream2 = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8"));
            JSONObject Test = new JSONObject();
            Log.d("gogogo", JsonToSend.toString());
            try {
                Test.put("product", 1514);
                Test.put("price", 1514);
                Test.put("quantity", 131);
                Test.put("measure", 0);
                Test.put("productData", JsonToSend.toString());
            } catch (JSONException e) {
                Log.e("MYAPP", "unexpected JSON exception", e);
            }



            // Начало контента
            outputStream.writeBytes(twoHyphens + boundary + lineEnd);
            // Заголовок элемента формы
            outputStream.writeBytes("Content-Disposition: form-data; name=\"" +
                    FORM_FILE_NAME + "\"; filename=\"" + filePath + "\"" + lineEnd);
            // Тип данных элемента формы
            outputStream.writeBytes("Content-Type: image/jpeg" + lineEnd);
            // Конец заголовка
            outputStream.writeBytes(lineEnd);
            // Поток для считывания файла в оперативную память
            FileInputStream fileInputStream = new FileInputStream(new File(filePath));

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

            // Считывание файла в оперативную память и запись его в соединение
            bytesRead = fileInputStream.read(buffer, 0, bufferSize);

            while (bytesRead > 0) {
                outputStream.write(buffer, 0, bufferSize);
                bytesAvailable = fileInputStream.available();
                bufferSize = Math.min(bytesAvailable, maxBufferSize);
                bytesRead = fileInputStream.read(buffer, 0, bufferSize);
            }

            // Конец элемента формы
            outputStream.writeBytes(lineEnd);
            outputStream.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

            // Получение ответа от сервера
            int serverResponseCode = connection.getResponseCode();

            // Закрытие соединений и потоков
            fileInputStream.close();
            outputStream.flush();
            outputStream.close();
            addFormField(outputStream2, "products", Test.toString());
            addFormField3(outputStream2, "report_date");
            addFormField3(outputStream2, "report_sum");
            addFormField2(outputStream2, "check_number", 3333);
            addFormField2(outputStream2, "report_sum", 4444);;
            Log.i("STATUS", String.valueOf(connection.getResponseCode()));
            Log.i("MSG" , connection.getRequestMethod());
            // Считка ответа от сервера в зависимости от успеха
            if(serverResponseCode == 201) {
                result = readStream(connection.getInputStream());
            } else {
                result = readStream(connection.getErrorStream());
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (ProtocolException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return result;
    }

    // Считка потока в строку
    public String readStream(InputStream inputStream) throws IOException {
        StringBuffer buffer = new StringBuffer();
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));

        String line;
        while ((line = reader.readLine()) != null) {
            buffer.append(line);
        }

        return buffer.toString();
    }
}

这是所需的分派形式:

  

{照片:[],产品:[],报告日期:空,报告总数:空,检查号:“”,qr_img:空,qr_link:“”}

旧表单数据表单:

  

-WebKitFormBoundaryefkgxHeaEjv3FGL7内容处置:form-data; name =“ report_date” 2018-08-17T12:00:00.000Z ------ WebKitFormBoundaryefkgxHeaEjv3FGL7 Content-Disposition:form-data; name =“照片”; filename =“Снимокэкранаот2018-08-06 15-46-27.png” Content-Type:image / png ------ WebKitFormBoundaryefkgxHeaEjv3FGL7 Content-Disposition:表单数据; name =“照片”; filename =“Снимокэкранаот2018-08-06 13-38-02.png” Content-Type:image / png ------ WebKitFormBoundaryefkgxHeaEjv3FGL7 Content-Disposition:表单数据; name =“照片”; filename =“ Collage.jpg”内容类型:image / jpeg ------ WebKitFormBoundaryefkgxHeaEjv3FGL7内容处置:form-data; name =“照片”; filename =“ Gatsby.jpg”内容类型:image / jpeg ------ WebKitFormBoundaryefkgxHeaEjv3FGL7内容处置:form-data; name =“ products” {“ product”:11292,“ price”:0,“ quantity”:“ 12”,“ measure”:10,“ productData”:{“ id”:11292,“ title”:“ Bellini multi PG 0275х300(1-йсорт)“,” full_title“:”贝里尼multi PG 0275х300(1-йсорт)BelliniКв.М。“,” brand_title“:”“,” collect_title“:” Bellini“,” slug“:” bellini-multi-pg-02-75kh300-1-i-sort“,” image“:null,” brand“:null,” collect“:1844,” category“:23,” barcode“:” 010400000177“,”价格“:” 0.00“,”度量“:10,” measure_display“:”Кв.М。“,”组“:”“}} ------ WebKitFormBoundaryefkgxHeaEjv3FGL7内容处置:表单数据; name =“ report_sum” 44440 ------ WebKitFormBoundaryefkgxHeaEjv3FGL7 Content-Disposition:表单数据; name =“ check_number” 33333 ------ WebKitFormBoundaryefkgxHeaEjv3FGL7-

我将非常感谢您提供的帮助,我已经整理了很长时间,但没有奏效( 附言我对这门语言的知识很抱歉

1 个答案:

答案 0 :(得分:0)

HttpURLConnection与formdata / multipart一起使用可能很麻烦,或者需要很多行bilerplate代码。尝试使用改造或okhttp之类的网络库,它们提供了简单的代码并带来了更多好处。

使用okhttp:-

首先在gradle中添加依赖项:-

compile 'com.squareup.okhttp3:okhttp:3.11.0'

现在创建一个请求:-

OkHttpClient client = new OkHttpClient();
RequestBody requestBody = new MultipartBody.Builder()
    .setType(MultipartBody.FORM)
    .addFormDataPart("somParam", "someValue")
    .build();

Request request = new Request.Builder()
    .url(BASE_URL + route)
    .post(requestBody)
    .build();


 //synchrounous call
  Response response = client.newCall(request).execute();

确保您从后台线程调用它,例如。在asynktask的doInBackground内部,并返回response.body.string()。

Okhttp reference