在我写的一个程序中,我想让用户通过文件选择对话框在本地机器上选择一个图像,然后能够将该图像的路径插入{ {1}}标记的{1}}属性。
src
我现在正在使用GWT并尝试了img
课程,但<img src="file:/path/to/selected/image.png">
方法在大多数浏览器下都没有返回真实路径 - Windows Chrome将其返回为{{ 1}}。
有没有办法,无论是在GWT还是本机Javascript下,都能获得本地选择文件的真实路径?
答案 0 :(得分:2)
答案 1 :(得分:1)
无法从使用javascript的浏览器获取本地选定文件的真实路径。它&#39;安全问题。使用HTML5,您可以获得图像本身并实现您想要实现的目标。这是一个很好的lib:lib-gwt-file.jar
答案 2 :(得分:1)
以Braj提供的链接为基础......以下是我的表现:
private String imageDataUrl;
static private native void observeFileSelection(MainActivity main, Element uploader, Element error) /*-{
function handleFileSelect(selevt) {
error.innerHTML = "";
var file = selevt.target.files[0];
if (file.size > 1 * 1024 * 1024) {
error.innerHTML = "Error: Image must be less that 1MiB in size.";
return;
}
var reader = new FileReader();
reader.onload = function (loadevt) {
main.@com.example.app.MainActivity::setSelectedImageDataUrl(Ljava/lang/String;)(loadevt.target.result);
}
reader.readAsDataURL(file);
}
uploader.addEventListener("change", handleFileSelect, false);
}-*/;
public void setSelectedImageDataUrl(String dataurl) {
imageDataUrl = dataurl;
}
private void handleOverlayButton() {
final DialogBox dialog = new DialogBox();
final HTMLPanel htmlpanel = new HTMLPanel(
S.mainOverlayChooseText() + "<hr><div id='fileupload'></div><div id='fileerror' style='color:red'></div><hr>");
dialog.setHTML("<b>" + S.mainOverlayChooseTitle() + "</b>");
dialog.add(htmlpanel);
dialog.setAnimationEnabled(true);
dialog.setGlassEnabled(true);
dialog.addStyleName("info-dialog");
final FileUpload file = new FileUpload();
file.setName("imgfile");
htmlpanel.add(file, "fileupload");
final SimplePanel error = new SimplePanel();
htmlpanel.add(error, "fileerror");
final Button ok = new Button(S.buttonOk());
ok.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
dialog.hide();
dialog.clear();
setOverlayImage(imageDataUrl);
imageDataUrl = null;
}
});
htmlpanel.add(ok);
final Button cancel = new Button(S.buttonCancel());
cancel.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
dialog.hide();
dialog.clear();
imageDataUrl = null;
}
});
htmlpanel.add(cancel);
dialog.center();
dialog.show();
observeFileSelection(this, file.getElement(), error.getElement());
}
private void setOverlayImage(String dataurl) {
// just for testing
final AbsolutePanel overlay = new AbsolutePanel();
final Image image = new Image(dataurl);
overlay.add(image);
RootPanel.get().add(overlay);
}
希望如果其他人也试图这样做会有所帮助。