GWT客户端图像上传&预习

时间:2014-05-29 23:54:52

标签: image gwt upload base64 gwt-rpc

我正在使用GWT,我想上传图像并显示其预览而不与服务器交互,因此gwtupload lib看起来不是一种方法。

上传并显示图像后,用户可以选择保存图像。我们的想法是通过GWT-RPC将图像作为Base64编码的字符串发送,最后将其作为CLOB存储在数据库中。

有没有简单的方法可以使用GWT或使用JSNI?

3 个答案:

答案 0 :(得分:1)

本文档回答了您的问题:

Reading files in JavaScript using the File APIs

答案 1 :(得分:1)

/**
 * This is a native JS method that utilizes FileReader in order to read an image from the local file system.
 * 
 * @param event A native event from the FileUploader widget. It is needed in order to access FileUploader itself.    * 
 * @return The result will contain the image data encoded as a data URL.
 * 
 * @author Dušan Eremić
 */
private native String loadImage(NativeEvent event) /*-{

    var image = event.target.files[0];

    // Check if file is an image
    if (image.type.match('image.*')) {

        var reader = new FileReader();
        reader.onload = function(e) {
            // Call-back Java method when done
            imageLoaded(e.target.result);
        }

        // Start reading the image
        reader.readAsDataURL(image);
    }
}-*/;

在imageLoaded方法中,您可以执行类似logoPreview.add(new Image(imageSrc))的操作,其中imageSrc是loadImage方法的结果。

FileUpload小部件的处理程序方法如下所示:

/**
 * Handler for Logo image upload.
 */
@UiHandler("logoUpload")
void logoSelected(ChangeEvent e) {
    if (logoUpload.getFilename() != null && !logoUpload.getFilename().isEmpty()) {
        loadImage(e.getNativeEvent());
    }
}

答案 2 :(得分:0)

假设您具有相机属性(它是FileUploader的实例),请执行以下操作:

camera.getElement().setAttribute("accept", "image/*");
camera.getElement().setAttribute("capture", "camera");
camera.getElement().setClassName("camera");

并让imgPreview一个Image实例,执行以下操作。

imgPreview.getElement().setAttribute("id", "camera-preview");
imgPreview.getElement().setAttribute("src", "#");
imgPreview.getElement().setAttribute("alt", "#");

现在在相机对象上添加一个处理程序,该处理程序将调用本机方法test1(NativeEvent)

camera.addChangeHandler( e-> {
            test1(e.getNativeEvent());
        });

public static native void test1(NativeEvent event) /*-{

        var image = event.target.files[0];

        var reader = new FileReader();
        reader.onload = function(e) {
           $wnd.$('#camera-preview').attr('src', e.target.result);
        }

        // Start reading the image
        reader.readAsDataURL(image);

}-*/;