一天中的其他时间,我需要发送数据方面的帮助,我是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-
我将非常感谢您提供的帮助,我已经整理了很长时间,但没有奏效( 附言我对这门语言的知识很抱歉
答案 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()。