GWT读取mime类型的客户端

时间:2016-08-25 08:33:19

标签: asynchronous gwt client-side

我试图在GWT客户端读取mime类型,以便在上传之前验证文件。为此,我使用JSNI使用HTML5 filereader API读取文件头。但是我的问题是GWT不等待读取的结果并继续执行代码。副作用是我的布尔值尚未设置,我的条件出错了。在GWT中是否有任何类似承诺的机制?

对此有任何帮助将不胜感激!

UploadImageButtonWidget.java

private boolean isMimeTypeValid = false;
private String mimeType = null;

public native boolean isValid(Element element)/*-{
    var widget = this;
    var files = element.files;
    var reader = new FileReader();
    var CountdownLatch = function (limit){
      this.limit = limit;
      this.count = 0;
      this.waitBlock = function (){};
    };
    CountdownLatch.prototype.countDown = function (){
      this.count = this.count + 1;
      if(this.limit <= this.count){
        return this.waitBlock();
      }
    };
    CountdownLatch.prototype.await = function(callback){
      this.waitBlock = callback;
    };
    var barrier = new CountdownLatch(1);
    reader.readAsArrayBuffer(files[0]);
    reader.onloadend = function(e) {
        var arr = (new Uint8Array(e.target.result)).subarray(0, 4);
        var header = "";
        for (var i = 0; i < arr.length; i++) {
            header += arr[i].toString(16);
        }
        widget.@com.portal.client.widgets.base.UploadImageButtonWidget::setMimeType(Ljava/lang/String;)(header);
        barrier.countDown();
    }

    return barrier.await(function(){
      return widget.@com.portal.client.widgets.base.UploadImageButtonWidget::isMimeTypeValid();
    });
}-*/

public void setMimeType(String headerString) {
    boolean mimeValid = true;
    if (headerString.equalsIgnoreCase(PNG_HEADER)) {
        mimeType = PNG_MIMETYPE;
    } else if (headerString.equalsIgnoreCase(GIF_HEADER)) {
        mimeType = GIF_MIMETYPE;
    } else if (headerString.equalsIgnoreCase(JPG_HEADER1) || headerString.equalsIgnoreCase(JPG_HEADER2) || headerString.equalsIgnoreCase(JPG_HEADER3)) {
        mimeType = JPG_MIMETYPE;
    } else {
        mimeValid = false;
        setValidationError(i18n.uploadErrorNotImageBasedOnMimeType());
        fileChooser.getElement().setPropertyJSO("files", null);

        setErrorStatus();
    }

    setMimeTypeValid(mimeValid);
}

public boolean isMimeTypeValid() {
    GWT.log("mimeType" + mimeType);
    GWT.log("isMimetypeValid" + String.valueOf(isMimeTypeValid));
    return mimeType != null;
}
活动中的

public void validateAndUpload() {
        UploadImageButtonWidget uploadImageButtonWidget = view.getUpload();
        if (uploadImageButtonWidget.isValid()) {
            GWT.log("mime ok: will be uploaded");
            uploadImage();
        } else {
            GWT.log("mime not ok: will not be uploaded");
        }
    }

0 个答案:

没有答案