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

时间:2018-02-06 10:54:39

标签: java android sql-server jdbc mssql-jdbc

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

  1. 尝试使用setBinaryStream直接上传文件
  2. 尝试使用setBinaryStream上传fileInputStream
  3. 此数据库列中不能声明blob类型
  4. 更新

    请求的代码:

    @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数据库的图片:

    Code of my database

    MyFile是varbinary(MAX)

    执行此操作时:statement.setBytes(2,/ inputStream / bytesArray);

    我得到以下结果。但这大约是433984字节长度,即一个文件读取的字节数。我该怎么办呢?

    Datbase Pic 2

1 个答案:

答案 0 :(得分:-1)

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