Файл PDF поврежден и увеличивается в размере при загрузке на FTP-сервер | Android Studio | java

#java #android #file #server #ftp-server

#java #Android #файл #сервер #ftp-сервер

Вопрос:

Когда я загружаю PDF-файл на Windows server, он загружается при загрузке из FileZilla. Размер файла также увеличивается в байтах. Некоторые файлы повреждены или некоторые файлы содержат только половину содержимого.

Любая помощь или код будут оценены по достоинству. Спасибо!

Нажмите, чтобы выбрать файл из каталога телефона:

    btnSelectFile.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent();
            intent.setAction(Intent.ACTION_GET_CONTENT);
            intent.setType("application/pdf");
            startActivityForResult(Intent.createChooser(intent, "Select PDF File"), 21);
        }
    });
 

По результату деятельности:

  @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
        case 21:
            if (resultCode == RESULT_OK) {
                // Get the Uri of the selected file
                uri = data.getData();
                uriString = uri.toString();
                myFile = new File(uriString);
                path = myFile.getAbsolutePath();
                displayName = null;
                file1 = Uri.fromFile(new File(path));

                if (uriString.startsWith("content://")) {
                    Cursor cursor = null;
                    try {
                        cursor = getActivity().getContentResolver().query(uri, null, null, null, null);
                        if (cursor != null amp;amp; cursor.moveToFirst()) {
                            displayName = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
                            textFileSelectedOrNot.setText(displayName);
                            fileName = textFileSelectedOrNot.getText().toString();
                        }
                    } finally {
                        cursor.close();
                    }
                } else if (uriString.startsWith("file://")) {
                    displayName = myFile.getName();
                    textFileSelectedOrNot.setText(displayName);
                    fileName = textFileSelectedOrNot.getText().toString();
                }
            }

            break;
    }
    super.onActivityResult(requestCode, resultCode, data);
}
 

Создание каталога на сервере и загрузка файла:

   class CreateDir extends AsyncTask<Void, Void, Void> {

    @Override
    protected Void doInBackground(Void... voids) {

        String server = "XX.XXX.X.XX";
        String username = "XXXXXXX";
        String password = "XXXXX";

        FTPClient ftpClient = new FTPClient();
        try {

            ftpClient.connect(server, 2102);
            ftpClient.login(username, password);
            ftpClient.setFileTransferMode(FTP.BINARY_FILE_TYPE);
            ftpClient.enterLocalPassiveMode();

            Log.d(TAG, "CONNECTED");

            String dirPath = "/ws.gajeratrust.org/TestingApp/"   fileId   "/";
            boolean created = ftpClient.makeDirectory(dirPath);

            FTPUtils.mkdir(ftpClient, dirPath);


       InputStream inputStream =getContentResolver().openInputStream(uri);
       ftpClient.storeFile(dirPath "/" fileName,inputStream);
       
       inputStream.close();



            ftpClient.logout();
            ftpClient.disconnect();
            Log.d(TAG, "DISCONNECTED");

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
 

Пожалуйста, проверьте код на любые изменения или что-то, что я закодировал неправильно, пожалуйста, прокомментируйте это.

Ответ №1:

Входной поток InputStream = новый FileInputStream(файл);

Замените это на

 InputStream inputStream = getContentResolver().openInputStream(data.getData());
 

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

Кроме того, мне интересно, что должны делать эти четыре строки перед строкой, которую я процитировал.

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

1. Сэр, есть еще один вопрос, файл поврежден. Любые мысли по этому поводу.

2. Пожалуйста, сначала покажите новый код. Вам может понадобиться курсор, чтобы действительно получить имя файла. И установите режим передачи в двоичный.

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

4. Затем, если в остальном это работает, вы должны установить transfermode в двоичный.

5. По умолчанию режим передачи будет текстовым. В этом режиме каждый n будет отправлен / получен как rn . Таким образом, полученный файл имеет больше байтов. Вы не упомянули об этом.

Ответ №2:

Проблема заключалась в том, что я неправильно устанавливал режим передачи. Правильный путь — это :

       ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
      ftpClient.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);