无法使用SparkJava将图像上传到cloudsql数据库

时间:2018-03-07 03:35:40

标签: java sql google-cloud-platform google-cloud-sql spark-java

我们有一个包含2个表,用户和图像的数据库。 users表有3行:password,username和primary key。 images表具有图像id,图像和用户标签(等于用户主键)。当我们尝试上传图片时,上传功能不会返回错误,但在显示图片时会出现错误:

  

[qtp2073702330-26] INFO spark.http.matching.MatcherFilter - 请求的路线

     

[/ jpeg / getImagesTen]尚未映射到Spark for Accept:

     

[图像/ WEBP,图像/ APNG,图像/ / *; Q = 0.8]

我们知道错误提到了get Images路由,但是我们知道它不是问题,因为在对cloudql中的所有内容进行简单查询时(在我们的图像表中),不会出现单个条目。所以我们知道上传功能有点瑕疵,或者cloudql不允许我们的图像。

我们用来上传图片的功能如下:

public static String uploadImage(spark.Request request) {
    Context context = getSessionContext(request.session());
    String username = request.session().attribute("username");
    MultipartConfigElement multipartConfigElement = new MultipartConfigElement("/tmp");
    request.raw().setAttribute("org.eclipse.jetty.multipartConfig", multipartConfigElement);
    int userID = 0;
    try {
        System.out.println(username);
        String getUserID = "SELECT UserID FROM users WHERE Username = '" + username + "';";
        PreparedStatement getUserIDStatement = context.db.conn.prepareStatement(getUserID);
        ResultSet getUserRS = getUserIDStatement.executeQuery();
        while (getUserRS.next()) {
            System.out.println(getUserRS.getInt("UserID"));
            userID = getUserRS.getInt("UserID");
        }
        System.out.println(userID);
        System.out.println(request.raw().getPart("file"));
        Part filePart = request.raw().getPart("file");
        InputStream fileContent = filePart.getInputStream();
        String sql = "INSERT images(Image, UserTag) VALUES (?,?);";
        PreparedStatement ps = db.conn.prepareStatement(sql);
        ps.setBinaryStream(1, fileContent);
        ps.setInt(2, userID);
        ps.execute();
    } catch (Exception e) {
        System.out.println(e);
    }
    return "<!DOCTYPE html>"
            + "<html>\""
            + "<body background=\"https://webgradients.com/public/webgradients_png/019%20Malibu%20Beach.png\">"
            + "                <form method=\"get\" action=\"/\">\n"
            + "                    <button type=\"submit\">Go Back</button>\n"
            + "                </form>"
            + "</body>"
            + "</html>";
}

这是邮寄路线:

 post("/protected/upload", (req, res) -> uploadImage(req));

以下是提交图片的HTML表单:

<form method="post" action="/protected/upload" enctype="multipart/form-data">
                    <input type="file" name="file"/>
                    <input type="submit" />
                </form>

1 个答案:

答案 0 :(得分:0)

我不知道Google Cloud SQL的行为,但是从我在您的代码中看到的内容:

INSERT images(Image, UserTag) VALUES (?,?);

应该阅读

INSERT INTO images(Image, UserTag) VALUES (?,?);

你想确保:

  • Google Cloud SQL已启用自动提交
  • 关闭所有与JDBC相关的对象以避免资源泄漏(PreparedStatementResultSet)。