当前位置: 首页 > 知识库问答 >
问题:

在发送表单数据方面需要帮助(android)

相弘和
2023-03-14
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();
    }
}

{photos:[],product:[],report_date:null,report_sum:null,check_number:“”,qr_img:null,qr_link:“”}

旧表单-数据表单:

------WebKitFormBoundaryEFKGXHEAEJV3FGL7内容-配置:表单-数据;name=“report_date”2018-08-17t12:00:00.000z------WebKitFormBoundaryEFKGXHEAEJV3FGL7内容-处置:表单-数据;name=“照片”;filename=“公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民name=“照片”;filename=“公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民公民name=“照片”;filename=“collage.jpg”content-type:image/jpeg------WebKitFormBoundaryeFKGXHEAEJV3FGL7 content-disposition:form-data;name=“照片”;filename=“gatsby.jpg”content-type:image/jpeg------WebKitFormBoundaryeFKGXHEAEJV3FGL7 content-disposition:form-data;name=“产品”{“产品”:11292,“价格”:0,“数量”:“12”,“措施”:10,“产品数据”:{“ID”:11292,“标题”:“贝里尼多PG 0275️300(1-️️))”,“Full_Title”:“Brand_Title”:“”Collect_Title“:”Bellini“,”Slug“:”Bellini-Multi-PG-02-75KH300-1-I-Sort“,”Image“:NULL,”Brand“:NULL,”Collection“:1844,”Category“:”Collection“:”:23,“条形码”:“010400000177”,“价格”:“0.00”,“度量”:10,“度量_display”:“χ~.”,“组”:“”}}----WebKitFormBoundaryEFKGXHEAEJV3FGL7内容-处置:表单-数据;name=“report_sum”44440------webkitformboundaryefkgxheaejv3fgl7 content-disposition:form-data;name=“check_number”33333------WebKitFormBoundaryEFKGXHEAEJV3FGL7--

我将非常感谢你的帮助,我已经整理了很长时间,但还是没有成功。(我为语言知识的贫乏而道歉。)

共有1个答案

贺轶
2023-03-14

使用HTTPurlConnection和FormData/MultiPart一起使用可能比较棘手,或者需要很多行双板代码。尝试使用网络库,如retrofit或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();
 类似资料:
  • 问题内容: 我想从一个名为Sorels的表更新一个名为的表。它们之间的链接是的等于Sorels表的。这是我对Merge语句的第一次尝试,并且我正在尝试学习语法。 运行此命令时,出现以下错误: 错误10/22/2009 1:38:51 PM 0:00:00.000 SQL Server数据库错误:关键字’ON’附近的语法不正确。46 0 添加的信息* 在建议了第一个修复程序之后,代码如下: 现在我得

  • 问题内容: 我是Java的新手,甚至还不是Java数据库连接的新手。当我将它放在Main类中时,我设法创建了一个数据库连接并查询了一个表。现在,将其移到名为Connection的新类中,我遇到了错误: 我收到一条错误消息,说找不到符号。符号:方法createStatement()和con = DriveManager .....不可比拟的类型。 有人可以帮忙吗? 另外,最好的做法是将连接放在这样的

  • 我是firestore数据库的新手,我已经在android studio中开发了一个应用程序来访问firestore数据库中的数据。我的应用程序有两种类型的用户类别1。管理2。用户我已经使用短信服务提供商的API实现了移动号码认证逻辑。我没有使用谷歌的firebase认证。我不能理解如何编写firestore数据库的规则。 admin-->可以读写所有集合 用户-->可以读取所有集合,但只能写入少

  • 我有这张桌子: 这是我的SQL查询: 我想要的查询是: > 我希望获得符合某些条件的记录,特别是字段在最近24小时内的记录 我需要获得紧接在#1中的记录之前的记录 将#1中的结果进一步过滤到其价格列在记录的历史记录中具有不同值(而不是-1)的记录 我面临的问题是查询太慢了。我有一百万张唱片。执行查询大约需要2分钟。我猜GROUP BY会使查询变慢。我想我需要做一个综合指数,但我不知道怎么做。 解释

  • 我有以下代码: 但不管我做什么都会出错 2015/05/18 08:45:51[错误]14466#0:*907 FastCGI在stderr中发送:“PHP消息:PHP致命错误:在第44行的/var/http/submit.PHP中对非对象调用成员函数execute()”同时从上游读取响应头,客户端:xx,服务器:,请求:“POST/submit.PHP http/1.1”,上游:fastcgi:

  • 表单帮助方法 表单是网页程序的基本组成部分,用于接收用户的输入。然而,由于表单中控件的名称和各种属性,使用标记语言难以编写和维护。Rails 提供了很多视图帮助方法简化表单的创建过程。因为各帮助方法的用途不一样,所以开发者在使用之前必须要知道相似帮助方法的差异。 读完本文,你将学到: 如何创建搜索表单等不需要操作模型的普通表单; 如何使用针对模型的表单创建和编辑数据库中的记录; 如何使用各种类型的