0

我正在使用一个非常简单的 JavaFx 客户端来上传文件。我以 1 MB 的块(使用字节缓冲区)读取文件并使用多部分 POST 上传到 PHP 脚本。我想更新客户端的进度条以在上传每个块后显示进度。上传进度的计算看起来正确,但进度条未更新。我正在使用绑定关键字。

我不是 JavaFx 专家,我希望有人能指出我的错误。我正在编写这个客户端来解决这里发布的问题(使用 PHP 中的分块上传 1GB 文件


 /*
 * Main.fx
 *
 * Created on Mar 16, 2010, 1:58:32 PM
 */
package webgloo;

import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.geometry.VPos;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.HBox;
import javafx.scene.layout.LayoutInfo;
import javafx.scene.text.Font;
import javafx.scene.control.ProgressBar;
import java.io.FileInputStream;

/**
 * @author rajeev jha
 */
var totalBytes:Float = 1;
var bytesWritten:Float = 0;
var progressUpload:Float;

var uploadURI = "http://www.test1.com/test/receiver.php";
var postMax = 1024000 ;


function uploadFile(inputFile: java.io.File) {

    totalBytes = inputFile.length();
    bytesWritten = 1;
    println("To-Upload - {totalBytes}");

    var is = new FileInputStream(inputFile);
    var fc = is.getChannel();
    //1 MB byte buffer

    var chunkCount = 0;
    var bb = java.nio.ByteBuffer.allocate(postMax);

    while(fc.read(bb) >= 0){

        println("loop:start");
        bb.flip();

        var limit = bb.limit();

        var bytes = GigaFileUploader.getBufferBytes(bb.array(), limit);
        var content = GigaFileUploader.createPostContent(inputFile.getName(), bytes);
        GigaFileUploader.upload(uploadURI, content);

        bytesWritten = bytesWritten + limit ;
        progressUpload = 1.0 * bytesWritten / totalBytes ;
        println("Progress is  - {progressUpload}");

        chunkCount++;
        bb.clear();
        println("loop:end");


    }

}


var label = Label {
            font: Font { size: 12 }
            text: bind "Uploaded - {bytesWritten * 100 / (totalBytes)}%"
            layoutInfo: LayoutInfo { vpos: VPos.CENTER maxWidth: 120 minWidth: 120 width: 120 height: 30 }
        }
def jFileChooser = new javax.swing.JFileChooser();

jFileChooser.setApproveButtonText("Upload");
var button = Button {
            text: "Upload"
            layoutInfo: LayoutInfo { width: 100 height: 30 }
            action: function () {
                var outputFile = jFileChooser.showOpenDialog(null);
                if (outputFile == javax.swing.JFileChooser.APPROVE_OPTION) {
                    uploadFile(jFileChooser.getSelectedFile());
                }
            }
        }
var hBox = HBox {
            spacing: 10
            content: [label, button]
        }
var progressBar = ProgressBar {
            progress: bind progressUpload
            layoutInfo: LayoutInfo { width: 240 height: 30 }
        }
var vBox = VBox {
            spacing: 10
            content: [hBox, progressBar]
            layoutX: 10
            layoutY: 10
        }

Stage {
    title: "Upload File"
    width: 270
    height: 120
    scene: Scene {
        content: [vBox]
    }
    resizable: false
}
4

1 回答 1

0

The real reason the GUI was not update was because everything in JavaFx is run in one thread (EDT). You need to use JavaFx Async framework To update GUI while some heavy background task is going now. Please see http://blogs.oracle.com/baechul/entry/javafx_1_2_async for an excellent reference. I have fixed this issue now by creating a separate JavaTaskBase for file upload.

于 2010-03-27T08:46:37.170 回答