如何使用 jdbc 在 MSSQL 中上传文件(文档)/zip?

Posted

技术标签:

【中文标题】如何使用 jdbc 在 MSSQL 中上传文件(文档)/zip?【英文标题】:How to upload files (documents)/zip in MSSQL using jdbc? 【发布时间】:2018-02-06 10:54:39 【问题描述】:

我正在尝试将文档(doc、ppt、pdf、txt..etc)存储在 MSSQL(在 AWS 中运行的服务器)中。我正在开发应用程序模块(android)。我可以从用户那里获取文件,但无法将其上传到数据库。 到目前为止我做了什么:

    尝试使用setBinaryStream直接上传文件 尝试使用 setBinaryStream 上传 fileInputStream 不能在此数据库列中声明 blob 类型

更新

请求的代码:

@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 字节长度,即为一个文件读取的字节数。我该怎么办?

【问题讨论】:

表数据库字段设置路径后为什么不保存文件? @quangminhs - Uri.getPath 正在获取用户手机中文件的路径。我需要将该文件发送到数据库。 不要贴图片,贴实际代码。并请描述实际问题。而且,最重要的是,InputStream.available() 不会像您认为的那样做,尤其是在您已经从该流中读取数据之后。 @MarkRotteveel 我已经更新了代码..看看 现在您忽略了inputStream.read(byte[]) 可能无法一次性读取完整文件的事实(返回值表示实际读取的字节数。您是否甚至费心阅读 API 文档和Java IO 基础教程?另外,您的次要问题 “将多个文件存储在 1 列中” 完全没有意义:您不应该将多个文件存储在单个列中。 【参考方案1】:

BULK IMPORT 本身无法执行此操作,但是如果您使用的是 SQL2005 或更高版本,则可以使用 SSIS。第一步是执行 Exectute Process Task 并使用 zip 实用程序解压缩文件。第二步是使用 SSIS Bulk Insert 任务将数据推送到 SQL Server 中。

【讨论】:

明白你在说什么,但我只是想上传一个 pdf。

以上是关于如何使用 jdbc 在 MSSQL 中上传文件(文档)/zip?的主要内容,如果未能解决你的问题,请参考以下文章

msSQL jdbc .. 我连接到服务器但如何连接到使用特定的 databaseName

从 JDBC MSSQL 获取返回值

如何使用 JDBC 连接到 SQL Server 2008 数据库?

Maven Shade 插件 + MsSQL JDBC -> 即时 JNI 错误 - 无效的签名文件清单

空结果集,使用 JDBC 和 MSSQL

MSSQL 查询执行计划缓存和 JDBC