2017-01-16 10 views
2

Google Apps Scriptを使用して、起動時にHTMLページを提示しています。私は、PDFと様々なフォーマットの画像の両方をアップロードできるように、WebページにFile Inputフィールドを追加しました。次に、アップロードしたファイルをgoogle.script.run。を実行してGoogleスクリプトに戻し、そのファイルをBlobとしてGoogle Cloud SQLデータベースに保存します。JDBCライブラリを使用してBlobをGoogle Cloud 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); 
     } 
    } 
    } 
} 

Googleのスクリプト:

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)です。生データを見ると、間違いなく類似点があります。以下をご覧ください。

 

    %PDF-1.3 
    %âãÏÓ 
    1 0 obj 
    > 
    endobj 
    2 0 obj 
    > 
    stream 
    ÿØÿà JFIF ,, ÿÛ 

    
    
    

Google Appsのスクリプト(第20行)を使用して格納する場合:

 

    %PDF-1.3 
    %âãÃà 
    1 0 obj 
    > 
    endobj 
    2 0 obj 
    > 
    stream 
    ÿÃÿà JFIF ,, ÿà  

    
    
    
    

私は私が送ることができるものに限定されたんだMySQLのワークベンチ(第20行)を使用して格納

私のGoogle Script機能には届きましたが、受け取ったバイナリストリングは正当なものです。 newBlobはJdbcBlobであり、setBytes関数を使用して2番目のパラメータにBlobSourceという型を設定しています。そのため、BlobSourceとしてUtilities.newBlobを使用してBlobを作成し、WebページのBinary Stringを入力として使用します。 results.updateBlobは、JdbcBlob型の2番目のパラメータを持っています。ここでは、newBlobを入力として提供しています。

私はこの時点で困っているので、助けていただければ幸いです。ありがとう!

+0

別の方法は、ドライブに保存し、その後、単にSQLのファイルIDを保存することです。 –

+0

ファイルは複数のユーザーによってアップロードされ、非常に多数になる可能性があります。そのため、複数の理由でデータベースストレージに保存することをお勧めします。1)私の個人的なドライブクォータにはカウントされません.2)ファイルは比較的整理されたままです.3)システムがGoogleドメイン外に移動する必要がある場合は、データベースをバックアップして損失のない別のサーバに移動できますデータの完全性しかし、まだ素晴らしいアイデア、それに感謝! – engnfrc

+0

ドライブに保存して同じ問題が発生したかどうかを確認してください。 –

答えて

0

申し訳ありませんが、解決策を見つけたようです。

関数btoa(...)を使用して、FileReaderからBase64にバイナリ文字列結果をエンコードします。次に、Google Scriptで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); 
     } 
    } 
    } 
} 

Googleのスクリプト:

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(); 
} 
関連する問題