我们有一个包含 2 个表、用户和图像的数据库。用户表有 3 行:密码、用户名和主键。图像表具有图像 ID、图像和用户标签(等于用户主键)。当我们尝试上传图像时,上传函数不会返回错误,但在显示图像时会出现错误:
[qtp2073702330-26] INFO spark.http.matching.MatcherFilter - 请求的路由
[/jpeg/getImagesTen] 尚未在 Spark for Accept 中映射:
[image/webp,image/apng,image/,/*;q=0.8]
我们知道错误提到了获取图像路由,但我们知道这不是问题,因为当对 cloudsql 中的所有内容(在我们的图像表中)进行简单查询时,没有出现一个条目。所以我们知道上传功能以某种方式存在缺陷,或者 cloudsql 不允许我们的图像。
我们用于上传图片的函数如下所示:
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>
我不知道Google Cloud SQL的行为,但从我在你的代码中看到的:
INSERT images(Image, UserTag) VALUES (?,?);
应该读
INSERT INTO images(Image, UserTag) VALUES (?,?);
并且您要确保:
- Google Cloud SQL 已启用自动提交
- 关闭所有与 JDBC 相关的对象以避免资源泄漏(
PreparedStatement
、ResultSet
)。