【发布时间】:2013-02-04 21:45:50
【问题描述】:
我正在尝试从 MySQL 表中读取图像 该图像被定义为 longblob,我正在使用 Eclipse Juno(更新)、Java 和 GWT(最新版本)。但是,当我运行时,我在页面上收到错误消息(我的第一个视图没有显示):
onModuleLoad() threw an exception
Exception while loading module org.AwardTracker.client.AwardTracker. See Development Mode for details.
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.google.gwt.dev.shell.ModuleSpace.onLoad(ModuleSpace.java:406)
at com.google.gwt.dev.shell.OophmSessionHandler.loadModule(OophmSessionHandler.java:200)
at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:526)
at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:364)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.RuntimeException: Deferred binding failed for 'org.AwardTracker.client.DBConnection' (did you forget to inherit a required module?)
at com.google.gwt.dev.shell.GWTBridgeImpl.create(GWTBridgeImpl.java:53)
at com.google.gwt.core.shared.GWT.create(GWT.java:57)
at com.google.gwt.core.client.GWT.create(GWT.java:85)
at org.AwardTracker.client.LoginView.<init>(LoginView.java:29)
at org.AwardTracker.client.AwardTracker.onModuleLoad(AwardTracker.java:14)
... 9 more
Caused by: com.google.gwt.core.ext.UnableToCompleteException: (see previous log entries)
at com.google.gwt.dev.shell.ModuleSpace.rebind(ModuleSpace.java:605)
at com.google.gwt.dev.shell.ModuleSpace.rebindAndCreate(ModuleSpace.java:465)
at com.google.gwt.dev.shell.GWTBridgeImpl.create(GWTBridgeImpl.java:49)
... 13 more
开发控制台有以下消息(前几行):
[DEBUG] [org.AwardTracker.AwardTracker] - Validating units:
[INFO] [org.AwardTracker.AwardTracker] - Ignored 4 units with compilation errors in first pass.
Compile with -strict or with -logLevel set to TRACE or DEBUG to see all errors.
[ERROR] [org.AwardTracker.AwardTracker] - Errors in 'file:/C:/Users/Glyndwr/Eclipse/Workspace/AwardTracker/src/org/AwardTracker/client/DBConnection.java'
[ERROR] [org.AwardTracker.AwardTracker] - Line 15: No source code is available for type java.sql.Blob; did you forget to inherit a required module?
我的 DBConnection 是:
package org.AwardTracker.client;
import java.util.List;
import java.sql.Blob;
import com.google.gwt.user.client.rpc.RemoteService;
/**
* The client side stub for the RPC service.
*/
public interface DBConnection extends RemoteService {
public User authenticateUser(String user, String pass, String level, String archived);
public User duplicateUser(String user, String pass, String level, String archived);
public User createUser(String user, String pass, String level, String archived);
public List<YouthMember> getYM(String id, String surname, String first_name, String dob, Blob image, String archived);
}
据此,我认为 java.sql.Blob 不能在 GWT 中使用。我应该使用什么?
我将图像存储在数据库中,而不是图像链接,因为我只有少量低分辨率图像要存储,因此数据库不应该因此而过度征税。
问候,
格林
我做了以下更改:
在 MySQLConnection 类的服务器端,我添加了以下方法(但是它有列出的错误):
public String getImageData(String id){
ResultSet result = null;
PreparedStatement ps = null;
String imageDataString = null;
try {
// Read in the image from the database.
ps = conn.prepareStatement(
"SELECT at_cub_details.cd_photograph " +
"FROM at_cub_details " +
"WHERE at_cub_details.cd_id = \"" + id + "\"");
result = ps.executeQuery();
while (result.next()) {
File file = new File(result.getString(1));
FileInputStream imageInFile = new FileInputStream(file);
byte imageData[] = new byte[(int) file.length()];
imageInFile.read(imageData);
//Convert Image byte array into Base64 String
imageDataString = encodeImage(imageData);
imageInFile.close();
}
}
catch (FileNotFoundException e) {
System.out.println("getImageData - Image not found" + e);
}
catch (IOException ioe) {
System.out.println("getImageData - Exception while reading the Image " + ioe);
}
catch (SQLException e) {
//do stuff on fail
System.out.println("SQLException getImageData 1.");
e.printStackTrace();
user = null;
}
finally {
if (result != null) {
try {
result.close();
}
catch (SQLException e) {
System.out.println("SQLException getImageData 2.");
e.printStackTrace();
}
}
if (ps != null) {
try {
ps.close();
}
catch (SQLException e) {
System.out.println("SQLException getImageData 3.");
e.printStackTrace();
}
}
}
return imageDataString;
}
/**
* Encodes the byte array into base64 string
* @param imageByteArray - byte array
* @return String a {@link java.lang.String}
*/
public static String encodeImage(byte[] imageByteArray) {
return Base64.encodeBase64URLSafeString(imageByteArray); [This line has the error: Multiple markers at this line
- The method encodeBase64URLSafeString(byte[]) is undefined for the
type Base64
- Line breakpoint:MySQLConnection [line: 287] - encodeImage(byte[]). However I have import org.apache.commons.codec.binary.Base64;]
}
在客户端我有:
public void renderYouthMemberTable(List<YouthMember> youthMemberList) {
if (youthMemberList != null) {
int row = 0;
int col = 0;
flexTable.clear();
for (YouthMember youthMember : youthMemberList) {
String id = youthMember.getId();
String imageDataString = getImageData(); [ Error: The method getImageData() is undefined for the type SelectPersonView]
// Converting a Base64 String into Image byte array
byte[] imageByteArray = decodeImage(imageDataString);
// Write a image byte array into file system
FileOutputStream imageOutFile = new FileOutputStream(
"/Users/jeeva/Pictures/wallpapers/water-drop-after-convert.jpg");
imageOutFile.write(imageByteArray);
flexTable.setWidget(row, col, new Label(imageByteArray)); [Error: The constructor Label(byte[]) is undefined]
//flexTable.setWidget(row, col, new Label(youthMember.getId()));
flexTable.setWidget(row + 1, col, new Label(youthMember.getSurname() + ", " + youthMember.getFirstname()));
//imageOutFile.close();
col = col + 1;
if (col > 7) {
row = row + 2;
col = 0;
}
}
}
}
/**
* Decodes the base64 string into byte array
* @param imageDataString - a {@link java.lang.String}
* @return byte array
*/
public static byte[] decodeImage(String imageDataString) {
return Base64.decodeBase64(imageDataString); [ With the error: The method decodeBase64(byte[]) in the type Base64 is not applicable for the arguments (String)]
}
我从http://www.myjeeva.com/2012/07/how-to-convert-image-to-string-and-string-to-image-in-java/复制了这段代码
问候,
格林
【问题讨论】:
-
一旦 Blob(或 BlobReplacement)到达客户端,您将如何处理它?您将如何实际绘制该图像?您是否考虑过只返回一个表示该图像 URL 的字符串,并拥有一个只提供这些图像的 servlet?
-
我将在 flextable 中显示图像。我是否过于简单地假设我可以将图像存储在表格中,然后以与存储和显示字符串或整数相同的方式显示该图像?我宁愿将所有数据保存在一个数据库中。问候,格林。
-
可能 - 你以前做过 HTML 工作吗?字符串和整数都可以很容易地呈现为相同的东西 - 字符串。仅使用字符串无法绘制图像(除非您只是在谈论
<img>标签),但如果您愿意放弃旧版本的 IE,您可以接近 data: urls。 -
您好 Colin,我知道我可以使用标签
src 在 html 中显示图像。但是,我知道源必须是文件和可选的目录路径(例如,images\picture.jpg)。我如何在 Eclipse java GWT 中从存储为 longblob 的 MySQL 表中提取图像(即小 jpg 图片 - 头部和肩部),然后在小部件(即 flextable)中显示图像。下一步是使图像可选择,以便用户选择图像,并在选择图像时将它们带到该人的详细信息视图。问候,格林。
-
您在这里添加了很多部分 - Eclipse 可用于编写代码,但它不会运行它; GWT 客户端代码仅在浏览器中运行,因此它无法将文件提取到服务器上的文件系统中。您必须有一个提供此文件的 servlet。如果是我,我不会费心将它提取到文件系统,而只是从另一个专门为此任务构建的 servlet 中流式传输结果。至于选择图像 - 先走,然后跑 - 否则这个问题只会越来越多。
标签: java mysql eclipse image gwt