3

MySQlからの挿入と読み取りにBLObサポートを使用しています。(JDBC)それは可能ですが、読み取ると数kbしかありません。理由はわかりません。動作するコードは次のとおりです。

 import java.sql.*;
import java.io.*;

public class InsertAndRetrieveImage {

 public static void main(String[] args) throws SQLException, FileNotFoundException, IOException {
  int id=7;
String connectionURL = "jdbc:mysql://127.0.0.1:3306/newdb";;
Connection con=null;
try{
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection(connectionURL, "root", "sesame");

 PreparedStatement ps = null;

 ps=con.prepareStatement("INSERT IGNORE INTO image VALUES(?,?,?)");

         File file = new File("e:/anarkali.wav");


         FileInputStream fs = new FileInputStream(file);

     try{
        System.out.println(fs.available());
         ps.setInt(1,id);
         ps.setBinaryStream(2,fs,fs.available());
         String filen=file.getName();
      ps.setString(3,filen);


      int i = ps.executeUpdate();



        String filename="filename";OutputStream os=null;byte[] content=null;
        ps= con.prepareStatement("SELECT fs from image where id=7");
        ResultSet rs = ps.executeQuery();
         System.out.println(rs);
      while(rs.next()) {


            Blob blob = rs.getBlob("fs");

        content = blob.getBytes(1, (int) blob.length());


        os = new FileOutputStream(new File("e://testanar.wav"));

    }
    os.write(content);
    os.close();
    con.close();
    ps.close();}
     catch(SQLException e)
     {System.out.println(e.getMessage());
     }

  }catch(Exception ex){}


  }

読み取りまたは書き込み中に問題が発生しますか?BLObのサイズが多少65535異なります。これはバグですか?

4

3 に答える 3

3

あなたのプログラムは正しいです。ファイルサイズが小さい場合は、正常に機能します。データ型を使用しBLOBてそのバイナリデータを格納している場合は、に変更しLONGBLOBます。データフィールドにファイルを保存しようとしたときにBLOB、ファイルサイズがBLOBデータ型の最大許容サイズを超えると、コンテンツが切り捨てられ、ファイルの一部のコンテンツが失われるためです(ファイルサイズによって異なります)。データ型を使用する場合でも、LONGBLOB確認しなければならないことがいくつかあります。説明します

LONGBLOBmysqlのWebサイトでは、の最大ファイルサイズが4GBであることがわかります。しかし、それは多くのことに依存します。大きなファイルを保存するには、いくつかのことを確認する必要があります。まずmy.iniファイルにあります。というプロパティがあります。これはmax_allowed_packet、mysqlクライアントまたはサーバーとの間で送受信できる最大のパケットを指定します。max_allowed_packetプロパティをより高い値に設定する必要があります。そして、mysqlを再起動します。一部のファイルシステムでは、4GBのファイルは許可されません。その場合、それほど大きなファイルをロードすることはできません。

あなたの場合、max_allowed_packetプロパティをより高い値に設定すると問題が解決すると思います。

次のテーブル作成スクリプトを使用できると思います

CREATE TABLE `image` (
    `id` INT(10) NULL DEFAULT NULL,
    `fs` LONGBLOB NULL,
    `filen` VARCHAR(50) NULL DEFAULT NULL
)
于 2012-12-19T18:11:13.767 に答える
1

すべてのパラメーターに固定値の長さがありますので、ここに例を示します。

    0 < length <=      255  -->  `TINYBLOB`
     255 < length <=    65535  -->  `BLOB`
   65535 < length <= 16777215  -->  `MEDIUMBLOB`
16777215 < length <=    2³¹-1  -->  `LONGBLOB`


TINYBLOB: maximum length of 255 bytes
BLOB: maximum length of 65,535 bytes
MEDIUMBLOB: maximum length of 16,777,215 bytes
LONGBLOB: maximum length of 4,294,967,295 bytes

このMAXサイズはバグではありませんが、値を格納するための長さです

あなたの場合MEDIUMBLOB、またはを使用しますLONGBLOB

于 2012-12-19T14:10:49.593 に答える
-1

私は数日前に同じ問題を抱えていました、そして私がしたことはInputStream利用可能なメソッドを使用しないことです。

使用する:

ps.setBinaryStream(2, fs);

ただし、それをサポートしていないjdbcドライバーがいくつかあるため、確認する必要があります

于 2012-12-06T19:31:46.927 に答える