如何使用JDBC库在Google Cloud SQL中存储Blob



我正在使用一个谷歌应用程序脚本,该脚本在启动时向用户显示HTML页面。我在网页上添加了一个"文件输入"字段,这样就可以上传各种格式的PDF和图像。接下来,我想获取上传的文件,通过运行Google.script.run.将其返回到谷歌脚本,然后在函数内部将文件作为Blob存储在我的谷歌云SQL数据库中。

以下是我迄今为止的一些代码:

HTML:

<input type="file" id="cert">
<input type="button" id="btnCheck" onclick="readFiles()" value="Read Files">

JavaScript:

function readFiles() {
var x = document.getElementById("cert");
if ('files' in x) {
if (x.files.length != 0) {
for (var i = 0, f; f = x.files[i]; i++) {
var reader = new FileReader();
// Closure to capture the file information.
reader.onload = (function(theFile) {
return function(e) {
google.script.run.storeFile(e.target.result);
};
})(f);
reader.readAsBinaryString(f);
}
}
}
}

谷歌脚本:

function storeFile(f) {
var conn = Jdbc.getConnection(dbUrl, user, userPwd);
var stmt = conn.createStatement(Jdbc.ResultSet.TYPE_SCROLL_INSENSITIVE, Jdbc.ResultSet.CONCUR_UPDATABLE);
var results = stmt.executeQuery('select * from my_table');
results.moveToInsertRow();
var newBlob = conn.createBlob();
var uBlob = Utilities.newBlob(f, 'application/pdf');
newBlob.setBytes(1, uBlob.getBytes());
results.updateBlob('file', newBlob);
results.insertRow();
results.moveToCurrentRow();
results.close();
stmt.close();
}

现在我们来谈谈手头的问题。此时,数据存储在数据库中,但似乎附加了许多额外的信息,当我使用MySQL Workbench将数据导出到文件中时(在本例中,我使用PDF进行测试),该文件无法打开。

如果我使用MySQL Workbench手动将文件插入数据库,则数据大小正确,可以导出,并将正确打开。我注意到,如果我打印uBlob.getBytes()的大小,则值为754244,如果打印uBlob.getDataAsString()的尺寸,则值是528004。原始文件大小为516kB(~528384)。从原始数据来看,肯定有相似之处,请观察以下内容。

使用MySQL工作台存储时(前20行):

%PDF-1.3%1 0对象>endobj2 0对象>流动伊亚菲夫

使用谷歌应用程序脚本存储时(前20行):

%PDF-1.3%1 0对象>endobj2 0对象>流动JFIF

我可以发送到谷歌脚本函数的内容有限,但收到的二进制字符串似乎是合法的。newBlob是一个JdbcBlob,我使用setBytes函数设置它,它的第二个参数类型为BlobSource,所以我使用Utilities.newBlob创建一个Blob用作BlobSource。results.updateBlob有第二个参数,类型为JdbcBlob,所以这里我提供newBlob作为输入。

如果我在这一点上遇到困难,我们将不胜感激。谢谢

好吧,看起来我找到了解决方案!

使用函数btoa(…)将FileReader中的二进制字符串结果编码为Base64。然后在Google脚本中使用Utilities.base64Decode(…)以Blob形式获取数据。

JavaScript:

function readFiles() {
var x = document.getElementById("cert");
if ('files' in x) {
if (x.files.length != 0) {
for (var i = 0, f; f = x.files[i]; i++) {
var reader = new FileReader();
// Closure to capture the file information.
reader.onload = (function(theFile) {
return function(e) {
google.script.run.storeFile(btoa(e.target.result));
};
})(f);
reader.readAsBinaryString(f);
}
}
}
}

谷歌脚本:

function storeFile(f) {
var conn = Jdbc.getConnection(dbUrl, user, userPwd);
var stmt = conn.createStatement(Jdbc.ResultSet.TYPE_SCROLL_INSENSITIVE, Jdbc.ResultSet.CONCUR_UPDATABLE);
var results = stmt.executeQuery('select * from my_table');
results.moveToInsertRow();
var newBlob = conn.createBlob();
newBlob.setBytes(1, Utilities.base64Decode(f));
results.updateBlob('file', newBlob);
results.insertRow();
results.moveToCurrentRow();
results.close();
stmt.close();
}

相关内容

  • 没有找到相关文章

最新更新