首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在android studio中将图片(文件)上传到服务器?

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

Stack Overflow用户
提问于 2018-06-15 04:35:51
回答 2查看 132关注 0票数 -1

我需要上传一张照片到服务器上。我试了很多方法,但都没有结果。

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

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

回答 2

Stack Overflow用户

发布于 2018-06-15 04:44:43

我为此创建了这个函数。您需要在与服务器的连接中发送此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)
                    }
                }   
            }    
        }
    }
票数 0
EN

Stack Overflow用户

发布于 2018-06-19 00:44:41

这个决定起到了帮助作用。感谢大家的回答)

    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();
        }
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50865541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档