lundi 19 décembre 2016

File's md5 was changed when I use websocket to upload it

I tried to use HTML5's method file.slice to cut a file, and then to upload using websocket.Below is my js code:

function upload() {
    var slicesize = 1024 * 1024 * 5;
    var file = document.getElementById("file").files[0];
    var ws = new WebSocket("ws://127.0.0.1:8080/file");
    var startsize = 0;
    var endsize = 0;
    var count = 0;
    ws.onopen = function () {
        console.log("connected to server.");
        ws.send(file.name);
        console.log("size : ", file.size);
        console.log("name size : ", file.name.length)
    };
    ws.onmessage = function (resp) {
        //console.log("received from server: ", resp.data);
        if (resp.data) {
            var sent = parseInt(resp.data);
            var percent = sent / file.size * 100;
            //console.log("percent:", percent, "%");
            $('#progress').attr("style", "width: " + (percent).toFixed(2) + "%");
            $('#progress').text(percent.toFixed(2) + "%");
            //console.log(sent, file.size);
            if (sent == file.size) {
                $('#progress').text("finish");
            }
            if (count == 0) {
                ws.send(file.size);
                count++;
            } else if (endsize < file.size) {
                console.log("test");
                startsize = endsize;
                endsize += slicesize;
                if (endsize > file.size) {
                    console.log("endsize > file.size");
                    endsize = file.size
                }
                console.log("endsize:", endsize);
                var blob = file.slice(startsize, endsize);
                var reader = new FileReader();
                reader.readAsArrayBuffer(blob);
                reader.onloadend = function loaded(event) {
                    var arrayBuffer = event.target.result;
                    ws.send(arrayBuffer);
                    console.log("sent slice, length is:", blob.size);
                    reader = null;
                }

            } else {
                startSize = endSize = 0;

            }
        }
    };
    ws.onclose = function () {
        console.log("closed websocket");
        loadMovie()
    }
}

and below is my server code, I use golang:

func UploadFile(ws *websocket.Conn) {
var err error
var count int
var filename string
var filesize int
var savepath string
recData := bytes.NewBuffer([]byte{})
for {
    var receive []byte
    if err = websocket.Message.Receive(ws, &receive); err != nil {
        log.Fatal(err)
        break
    }
    if count == 1 {
        filename = string(receive)
    } else if count == 1 {
        filesize, err = strconv.Atoi(string(receive))
    } else {
        recData.Write(receive)
    }
    count++
    sent := strconv.Itoa(len(recData.Bytes()))

    if err = websocket.Message.Send(ws, sent); err != nil {
        log.Fatal(err)
        break
    }
    if len(recData.Bytes()) == filesize && sent != "0" {
        break
    }
}
wd, err := os.Getwd()
if err != nil {
    log.Fatal(err)
}
savepath = path.Join(wd, "static", "upload")
movie := Movie{
    Name: filename,
    Path: savepath,
    Size: filesize,
    Time: time.Now().Format("2006-01-02 15:04:05"),
}
fp, err := os.Create(path.Join(savepath, movie.Time + movie.Name))
if err != nil {
    log.Fatal(err)
}
defer fp.Close()

recData.WriteTo(fp)

}

When I upload a file which bigger than slicesize, such as 20MB, the file's md5 will be change when it saved to server's disk, but number of byte not be changed.

Why, and how to solve it ?




Aucun commentaire:

Enregistrer un commentaire