我需要将图片上传到服务器。我尝试了很多方法,但没有任何结果。
以下是我尝试使用的代码:
URL url2 = new URL(url_for_loading_image);
conn = (HttpURLConnection) url2.openConnection();
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setRequestMethod("POST");
conn.setRequestProperty("Authorization", "token " + ClientToken);
conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
conn.setRequestProperty("Accept","application/json");
JSONObject jsonParam2 = new JSONObject();
jsonParam2.put("photo", getActivity().getExternalCacheDir()+"/saved.jpg");
jsonParam2.put("collect", "ddd");
jsonParam2.put("user_comment", "dsdsds");
Log.i("JSON", jsonParam2.toString());
DataOutputStream os2 = new DataOutputStream(conn.getOutputStream());
//os.writeBytes(URLEncoder.encode(jsonParam.toString(), "UTF-8"));
os.writeBytes(jsonParam2.toString());
os2.flush();
os2.close();
我如何从网站上了解这部分代码,负责下载?
<div class="form-group ">
<label class="col-sm-2 control-label ">
Фото чека
</label>
<div class="col-sm-10">
<input name="photo" type="file" value="" >
</div>
</div>
答案 0 :(得分:0)
我为此创建了这个功能。您需要在与服务器的连接中发送此RequestBody。
return object : RequestBody() {
override fun contentType() = return MediaType.parse("application/octet-stream")
override fun writeTo(sink: BufferedSink?) {
var bytes = ByteArray(length)
while (file.available() > 0) {
when (file) {
avaible >= length -> {
file.read(bytes, 0, length)
sink?.write(bytes)
}
else -> {
bytes = ByteArray(file.available())
file.read(bytes, 0, file.available())
sink?.write(bytes)
}
}
}
}
}
答案 1 :(得分:0)
你正在尝试做一些无效的事情
JSON是用于交换 TEXT 信息的标准格式,或任何可以轻松转换为文本的格式。
正如您在自己的代码中所看到的:
conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
此连接将发送json data
。
您可以想象,照片,视频和其他媒体不是文本信息,不会被json api解析。
如果我理解您的打印屏幕,您的代码的实际结果是您发送文件路径,这是您的代码的预期行为......
以下是显示如何上传媒体文件的代码
/**
* This constructor initializes a new HTTP POST request with content type
* is set to multipart/form-data
*
* @param requestURL
* @param charset
* @throws IOException
*/
public MultipartUtility(String requestURL, String charset)
throws IOException {
this.charset = charset;
// creates a unique boundary based on time stamp
boundary = "===" + System.currentTimeMillis() + "===";
URL url = new URL(requestURL);
httpConn = (HttpURLConnection) url.openConnection();
httpConn.setUseCaches(false);
httpConn.setDoOutput(true); // indicates POST method
httpConn.setDoInput(true);
httpConn.setRequestProperty("Content-Type",
"multipart/form-data; boundary=" + boundary);
outputStream = httpConn.getOutputStream();
writer = new PrintWriter(new OutputStreamWriter(outputStream, charset),
true);
}
您可能需要向服务器发出两个请求或调整上面的代码以将json数据发送到多部分表单
答案 2 :(得分:0)
这个决定有所帮助。谢谢大家的答案)
public class FilesUploadingTask extends AsyncTask<Void, Void, String> {
// Конец строки
private String lineEnd = "\r\n";
// Два тире
private String twoHyphens = "--";
// Разделитель
private String boundary = "----WebKitFormBoundary9xFB2hiUhzqbBQ4M";
// Переменные для считывания файла в оперативную память
private int bytesRead, bytesAvailable, bufferSize;
private byte[] buffer;
private int maxBufferSize = 1*1024*1024;
// Путь к файлу в памяти устройства
private String filePath;
// Адрес метода api для загрузки файла на сервер
public static final String API_FILES_UPLOADING_PATH = "http://91.226.82.163:8000/api/v1/gallery/checklog/";
// Ключ, под которым файл передается на сервер
public static final String FORM_FILE_NAME = "photo";
public FilesUploadingTask(String filePath) {
this.filePath = filePath;
}
@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 " + 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());
// Формирование multipart контента
// Начало контента
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();
Log.i("STATUS", String.valueOf(connection.getResponseCode()));
Log.i("MSG" , connection.getRequestMethod());
// Считка ответа от сервера в зависимости от успеха
if(serverResponseCode == 200) {
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();
}
}