Я пытаюсь хранить документы (doc, ppt, pdf, txt..etc) в MSSQL (сервер, работающий в AWS). Я работаю над модулем приложения (Android). Я могу получить файлы от пользователя, но я не могу загрузить их в базу данных. Что я сделал до сих пор:
- Пытался загрузить файл напрямую с помощью setBinaryStream
- Пытался загрузить файлInputStream с помощью setBinaryStream
- В этом столбце базы данных нельзя объявить тип большого двоичного объекта.
Обновить
Запрошенный код:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.sm_attachments:
FilePickerDialog filePickerDialog = new FilePickerDialog(SendMailToCustomers.this,properties);
filePickerDialog.setTitle("Select Files");
filePickerDialog.show();
filePickerDialog.setDialogSelectionListener(new DialogSelectionListener() {
@Override
public void onSelectedFilePaths(String[] files) {
for (String file : files) {
Uri uri = Uri.fromFile(new File(file));
try {
File file1 = new File(uri.getPath());
//InputStream inputStream = new FileInputStream(new File(uri.getPath()));
byte[] bytesArray = null;
bytesArray = new byte[(int) file1.length()];
FileInputStream fileInputStream = new FileInputStream(file1);
fileInputStream.read(bytesArray);
String sql = "INSERT INTO Storedata (FileName,MyFile) values (?,?)";
PreparedStatement statement = con.prepareStatement(sql);
statement.setString(1,"myNewFile");
//statement.setBinaryStream(2, /*inputStream*/fileInputStream,fileInputStream.available());
statement.setBytes(2, /*inputStream*/bytesArray);
int row = statement.executeUpdate();
if(row>0){
Toast.makeText(SendMailToCustomers.this, "The File was inserted Successfully", Toast.LENGTH_SHORT).show();
Log.d(TAG, "onSelectedFilePaths: Inserted File Successfully");
}
else{
Toast.makeText(SendMailToCustomers.this, "Failed To Insert File", Toast.LENGTH_SHORT).show();
Log.d(TAG, "onSelectedFilePaths: Failed To Insert File");
}
} catch (Exception e) {
Log.d(TAG, "onSelectedFilePaths: "+"Exception - "+e.getMessage()+"\n");
e.printStackTrace();
}
break;
Файлы String[] — это выбранные файлы (Uri) для загрузки.
Далее изображение моей базы данных SQL:
MyFile является varbinary (MAX)
После этого: statement.setBytes(2, /inputStream/bytesArray);
Я получаю следующий результат. Но это около 433984 байтов, то есть байтов, прочитанных для одного файла. Как мне это сделать?
InputStream.available()
не делает того, что вы думаете, особенно после того, как вы уже прочитали данные из этого потока. - person Mark Rotteveel   schedule 06.02.2018inputStream.read(byte[])
может не прочитать весь файл за один раз (возвращаемое значение указывает количество фактически прочитанных байтов. Вы даже удосужились прочитать документацию API и базовый учебник по Java IO? Также у вас второстепенный вопрос для хранения нескольких файлов в 1 столбце вообще нет смысла: не следует хранить несколько файлов в одном столбце. - person Mark Rotteveel   schedule 06.02.2018