如何将图片(文件)上传到android studio上的服务器?

时间:2018-06-14 20:35:51

标签: java android json

我需要将图片上传到服务器。我尝试了很多方法,但没有任何结果。

以下是我尝试使用的代码:

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();

loader screen

我如何从网站上了解这部分代码,负责下载?

<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>

3 个答案:

答案 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();
        }
    }