Как загрузить файлы (документы)/zip в MSSQL с помощью jdbc?

Я пытаюсь хранить документы (doc, ppt, pdf, txt..etc) в MSSQL (сервер, работающий в AWS). Я работаю над модулем приложения (Android). Я могу получить файлы от пользователя, но я не могу загрузить их в базу данных. Что я сделал до сих пор:

  1. Пытался загрузить файл напрямую с помощью setBinaryStream
  2. Пытался загрузить файлInputStream с помощью setBinaryStream
  3. В этом столбце базы данных нельзя объявить тип большого двоичного объекта.

Обновить

Запрошенный код:

@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 байтов, то есть байтов, прочитанных для одного файла. Как мне это сделать?

База данных Рис 2


person supro_96    schedule 06.02.2018    source источник
comment
Почему бы не сохранить файл после установки пути в поле таблицы базы данных?   -  person quangminhs    schedule 06.02.2018
comment
@quangminhs - Uri.getPath получает путь к файлу в телефоне пользователя. Мне нужно отправить этот файл в базу данных.   -  person supro_96    schedule 06.02.2018
comment
Не публикуйте изображения, публикуйте фактический код. И, пожалуйста, опишите реальную проблему. И, что наиболее важно, InputStream.available() не делает того, что вы думаете, особенно после того, как вы уже прочитали данные из этого потока.   -  person Mark Rotteveel    schedule 06.02.2018
comment
@MarkRotteveel, я обновил код... посмотри   -  person supro_96    schedule 06.02.2018
comment
Теперь вы игнорируете тот факт, что inputStream.read(byte[]) может не прочитать весь файл за один раз (возвращаемое значение указывает количество фактически прочитанных байтов. Вы даже удосужились прочитать документацию API и базовый учебник по Java IO? Также у вас второстепенный вопрос для хранения нескольких файлов в 1 столбце вообще нет смысла: не следует хранить несколько файлов в одном столбце.   -  person Mark Rotteveel    schedule 06.02.2018
comment
Я настоятельно рекомендую вам перефразировать свой вопрос и описать реальную проблему, которую вы пытаетесь решить, вместо того, чтобы просить нас исправить ошибки в вашем текущем коде. Поскольку ваш текущий код, кажется, случайным образом пробует что-то, пока оно не сработает, это не очень хороший подход при программировании.   -  person Mark Rotteveel    schedule 06.02.2018
comment
@MarkRotteveel Ах .. Я не видел этого исключения, сейчас прочитаю документы. Я намерен заархивировать документы и хранить их в одном столбце базы данных, чтобы избежать головной боли. Что я сделал, так это проверил, как будет храниться 1 файл.   -  person supro_96    schedule 06.02.2018
comment
Давайте продолжим обсуждение в чате.   -  person supro_96    schedule 06.02.2018


Ответы (1)


МАССОВЫЙ ИМПОРТ изначально не сможет этого сделать, однако, если вы используете SQL2005 или более позднюю версию, вы можете использовать SSIS. Первым шагом будет выполнение задачи Exectute Process и использование утилиты zip для распаковки файла. Второй шаг — использовать задачу массовой вставки служб SSIS для передачи данных в SQL Server.

person spandey    schedule 06.02.2018
comment
Я понял, о чем вы говорите, но я пытался загрузить только один PDF-файл. - person supro_96; 06.02.2018