如何使用 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 连接到 SQL Server 2008 数据库?