хочу загрузить файл на сервер, используя асинхронную задачу (фоновую) и составную часть с помощью okhttp 3, а также получить ход загрузки

#android #file-upload #android-asynctask

#Android #файл-загрузить #android-asynctask

Вопрос:

хотите загрузить файл с каким-либо другим содержимым на сервер, используя okhttp 3 в фоновом режиме, используя multipart, а также получить ход загрузки, а также уведомить о ходе в адаптере для определенного элемента.

Ответ №1:

Попробуйте это

 RequestBody videoBody = RequestBody.create(MediaType.parse("video/*"), file);
        RequestBody requestBody = new MultipartBody.Builder()
                .setType(MultipartBody.FORM)
                .addFormDataPart("file", "name", videoBody)
                .build();
        requestBuilder = new Request.Builder()
                .url(mainUrlString)
                .post(requestBody)
                .build();
  

Ответ №2:

попробуйте это, чтобы загрузить файл

 private PrintWriter writer;
private OutputStream outputStream;

public void addFilePart(File uploadFile) throws IOException {

    outputStream = httpConn.getOutputStream();
    writer = new PrintWriter(new OutputStreamWriter(outputStream, charset), true);

    String fileName = uploadFile.getName();
    writer.append("--").append(boundary).append(LINE_FEED);
    writer.append("Content-Disposition: form-data; name=""   "file"   ""; filename="").append(fileName).append(""")
            .append(LINE_FEED);
    writer.append("Content-Type: "   "application/octet-stream")
            .append(LINE_FEED);
    writer.append(LINE_FEED);
    writer.flush();

    FileInputStream inputStream = new FileInputStream(uploadFile);
    byte[] buffer = new byte[4096];
    int bytesRead;
    float bytesWritten = 0;
    int totalSize = (int) uploadFile.length();
    while ((bytesRead = inputStream.read(buffer)) != -1) {
        if (isCanceled)
            return;
        outputStream.write(buffer, 0, bytesRead);
        bytesWritten  = bytesRead;
        int progress = (int) ((bytesWritten * fileUploadProgress) / totalSize);
        progressUpdateListener.onProgressUpdate(progress);// your progress % here
    }
    outputStream.flush();
    inputStream.close();
    writer.append(LINE_FEED);
    writer.flush();
}
  

Редактировать

 public class UploadFileToServer {

    private final String boundary;
    private static final String LINE_FEED = "rn";
    private HttpURLConnection httpConn;
    private String charset;
    private OutputStream outputStream;
    private PrintWriter writer;
    private ProgressUpdateListener progressUpdateListener;
    private Context context;

    /**
     * This constructor initializes a new HTTP POST request with content type
     * is set to multipart/form-data
     *
     * @param requestURL requestURL
     * @param charset    charset
     * @param boundary   boundary
     * @throws IOException ioException
     */
    public UploadFileToServer(Context context, String requestURL, String charset, String boundary, ProgressUpdateListener progressUpdateListener) throws IOException {
        this.context = context;
        this.charset = charset;
        this.progressUpdateListener = progressUpdateListener;

        // creates a unique boundary based on time stamp
        this.boundary = boundary;
        URL url = new URL(requestURL);
        httpConn = (HttpURLConnection) url.openConnection();
        httpConn.setUseCaches(false);
        httpConn.setDoOutput(true);    // indicates POST method
        httpConn.setDoInput(true);
        isCanceled = false;

        httpConn.setRequestProperty("Connection", "Keep-Alive");

        httpConn.setRequestProperty("Content-Type", "multipart/form-data; boundary="   boundary);

        outputStream = httpConn.getOutputStream();
        writer = new PrintWriter(new OutputStreamWriter(outputStream, charset), true);
    }

    /**
     * Adds a upload file section to the request
     *
     * @param uploadFile a File to be uploaded
     * @throws IOException ioException
     */
    public void addFilePart(File uploadFile)
            throws IOException {
        String fileName = uploadFile.getName();
        writer.append("--").append(boundary).append(LINE_FEED);
        writer.append("Content-Disposition: form-data; name=""   "file"   ""; filename="").append(fileName).append(""")
                .append(LINE_FEED);
        writer.append("Content-Type: "   "application/octet-stream")
                .append(LINE_FEED);
//        writer.append("Content-Transfer-Encoding: binary").append(LINE_FEED);
        writer.append(LINE_FEED);
        writer.flush();

        FileInputStream inputStream = new FileInputStream(uploadFile);
        byte[] buffer = new byte[4096];
        int bytesRead;
        float bytesWritten = 0;
        int totalSize = (int) uploadFile.length();
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, bytesRead);
            bytesWritten  = bytesRead;
            int progress = (int) ((bytesWritten * fileUploadProgress) / totalSize);
            progressUpdateListener.onProgressUpdate(progress);
        }
        outputStream.flush();
        inputStream.close();
        writer.append(LINE_FEED);
        writer.flush();
    }


    public interface ProgressUpdateListener {
        void onProgressUpdate(int progress);
    }
}
  

теперь вы можете вызвать этот класс следующим образом,

 UploadFileToServer uploadFileToServer = new UploadFileToServer(context, url, "UTF_8", boundary,
                                    new UploadFileToServer.ProgressUpdateListener() {
   @Override
   public void onProgressUpdate(int progress) {
       Log.e("Progress", "onProgressUpdate: "   progress );                                    
     }
  });

uploadFileToServer.addFilePart(new File(filePath));
  

Комментарии:

1. как отправить другие данные, отправленные с файловыми данными

2. progressUpdateListener.onProgressUpdate (прогресс), где определить и как

3. это интерфейс, вы должны создать интерфейс для уведомления о каждом прогрессе

4. спасибо за вашу поддержку, не могли бы вы, пожалуйста, предоставить подробный код для интерфейса

5. откуда следует вызывать addFilePart — основное действие или адаптер, а также onProgressUpdate