java - 从服务器获取图像并保存到 MySQL DB

标签 java mysql url ftp inputstream

我从服务器获取图像作为 InputStream,然后将其保存到 mySQL 数据库。它在我使用 Thread.sleep(5000); 时有效。但是,如果我不使用它,则没有图片会保存到数据库中,或者只有一张图片和一半或更少。所以我知道程序需要时间将图像写入数据库,但需要多少时间?这就是问题,我想确切地知道它何时将图像写入数据库并可以开始下一张图像。下面是我的代码:

        ResultSet rs = stmt.executeQuery(query);
        while (rs.next()) {

            int ID = rs.getInt(1);
            String myName = rs.getString(2);

            try {

                String myCommand = "take picture and save /mydir/mydir2/mydir3" + myName + ".png";
                telnet.sendCommand(myCommand); // Here taking a picture via telnet
                // Thread.sleep(5000);// If I uncomment this line it works

                String sqlCommand = "UPDATE my_table SET Picture = ? WHERE ID ='" + ID +"';";
                PreparedStatement statement = conn.prepareStatement(sqlCommand);

                String ftpUrl = "ftp://"+server_IP+"/mydir/mydir2/mydir3" + myName + ".png;type=i";

                URL url = new URL(ftpUrl);
                URLConnection connUrl = url.openConnection();

                //Thread.sleep(5000); // If I uncomment this line, it works too.

                InputStream inputStreamTelnet = connUrl.getInputStream();

                statement.setBlob(1, inputStreamTelnet);
                int row = statement.executeUpdate();
                if (row > 0) {
                    System.out.println("A picture was inserted into DB.");
                    System.out.println("Value of row(s) : " + row);
                }

            } catch (Exception e) {
                e.printStackTrace();
            }

        } // End of while

我希望将 waiting(sleep) 放在 InputStream inputStreamTelnet = connUrl.getInputStream(); 之后,但是当我将 sleep 放在这一行之后时它不起作用。它仅在 sleep 之前有效。有人能解释一下为什么吗,我想避免使用 Thread.sleep(5000); 而是想等待准确的时间或根本不等待,这将使程序更快,也可能有保存图片可能需要 5 秒以上的时间,或者保存图片不需要时间但打开 url 连接。当我取消注释程序运行的其中之一时,代码上有 2 条 sleep 线(成功将图像保存到 mysql 数据库)。我还在服务器上验证了图像存在,但最后我没有在 mysql 数据库中看到它们。

更新:我删除了 try block 和 telnet 的东西现在它不需要等待就可以工作但是我真的需要 telnet 的东西......

更新 2:检查我的 telnet 类后发现我忘记应用我对单行所做的更改...现在它无需等待即可工作!

最佳答案

嗯,我在 JDK 1.7.0_67/PostgreSQL 9.2 上测试了我的代码,它运行良好:

public class ImageLoader {
    private static final int START_IMAGE_ID = 1;
    private static final int END_IMAGE_ID = 1000;

    private static final String IMAGE_URL = "http://savepic.net/%d.jpg";

    public static void main(String[] args) throws SQLException, IOException {
        Connection connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/test", "username", "password");
        PreparedStatement imageStatement = connection.prepareStatement("INSERT INTO public.image VALUES(?, ?)");

        for (int i = START_IMAGE_ID; i <= END_IMAGE_ID; i++) {
            String imageUrl = String.format(IMAGE_URL, i);

            URL url = new URL(imageUrl);
            URLConnection urlConnection = url.openConnection();

            imageStatement.setLong(1, i);
            imageStatement.setBytes(2, read(urlConnection.getInputStream()));

            int count = imageStatement.executeUpdate();
            if (count != 1) {
                throw new IllegalStateException("Image with ID = " + i + " not inserted");
            } else {
                System.out.println("Image (" + imageUrl + ") saved to database");
            }
        }

        imageStatement.close();
        connection.close();
    }

    private static byte[] read(InputStream inputStream) throws IOException {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(1 << 15); // assume image average size ~ 32 Kbytes
        BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);

        byte[] buffer = new byte[1 << 10];

        int read = -1;
        while ((read = bufferedInputStream.read(buffer)) != -1) {
            byteArrayOutputStream.write(buffer, 0, read);
        }

        return byteArrayOutputStream.toByteArray();
    }
}

关于java - 从服务器获取图像并保存到 MySQL DB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26892076/

相关文章:

php 通过电子邮件从数据库中获取您的详细信息

url - 是否有用于以 1080p 显示视频的 YouTube URL 格式?

java - 无法在 java 中为 .net 中创建的 svc 服务创建 stub

java - 从大文件中选择随机元素时出现 NumberFormatException

mysql - 用于查找可能单词的正则表达式(拼字游戏风格)

具有相同数据的所有列的mysql正则表达式

django - 如何使用查询参数构造 Django 反向/url?

jquery - WordPress - 一页导航

java - 使用 Apache Camel 对 FTP 消费者进行单元测试

java - 用户输入try&catch