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