Sorry for my English, I lust post my code:
in FileUploadController:
Code:
...
byte[] buffer = new byte[8 * 1024];
MonitoredFileOutputStream fileOutputStream = new MonitoredFileOutputStream(filePath + filename, new UploadListenerFile(request, 0l));
while ((i = inputStream.read(buffer)) != -1) {
fileOutputStream.write(buffer, 0, i);
}
fileOutputStream.flush();
fileOutputStream.close();
...
MonitoredFileOutputStream
Code:
public class MonitoredFileOutputStream extends FileOutputStream {
private FileOutputStreamListener listener;
public MonitoredFileOutputStream(String name, FileOutputStreamListener listener) throws FileNotFoundException {
super(name);
this.listener = listener;
this.listener.start();
}
public void write(byte b[], int off, int len) throws IOException {
super.write(b, off, len);
listener.bytesRead(len - off);
}
public void write(byte b[]) throws IOException {
super.write(b);
listener.bytesRead(b.length);
}
public void write(int b) throws IOException {
super.write(b);
listener.bytesRead(1);
}
public void close() throws IOException {
super.close();
listener.done();
}
public void flush() throws IOException {
super.flush();
}
}
FileOutputStreamListener
Code:
public interface FileOutputStreamListener {
public void start();
public void bytesRead(int bytesRead);
public void error(String message);
public void done();
}
UploadListenerFile
Code:
public class UploadListenerFile implements FileOutputStreamListener {
private HttpServletRequest request;
private long delay = 0;
private long startTime = 0;
private int totalToRead = 0;
private int totalBytesRead = 0;
private int totalFiles = -1;
public UploadListenerFile(HttpServletRequest request, long debugDelay) {
this.request = request;
this.delay = debugDelay;
totalToRead = request.getContentLength();
this.startTime = System.currentTimeMillis();
}
public void start() {
totalFiles ++;
updateUploadInfo("start");
}
public void bytesRead(int bytesRead) {
totalBytesRead = totalBytesRead + bytesRead;
updateUploadInfo("progress");
try {
Thread.sleep(delay);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
public void error(String message) {
updateUploadInfo("error");
}
public void done() {
updateUploadInfo("done");
}
private long getDelta() {
return (System.currentTimeMillis() - startTime) / 1000;
}
private void updateUploadInfo(String status) {
long delta = (System.currentTimeMillis() - startTime) / 1000;
request.getSession().setAttribute("uploadInfo", new UploadInfo(totalFiles, totalToRead, totalBytesRead, delta, "temp"));
}
}
UploadInfo
Code:
public class UploadInfo {
private long totalSize = 0;
private long bytesRead = 0;
private long elapsedTime = 0;
private String status = "done";
private int fileIndex = 0;
public UploadInfo() {
}
public UploadInfo(int fileIndex, long totalSize, long bytesRead, long elapsedTime, String status) {
this.fileIndex = fileIndex;
this.totalSize = totalSize;
this.bytesRead = bytesRead;
this.elapsedTime = elapsedTime;
this.status = status;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public long getTotalSize() {
return totalSize;
}
public void setTotalSize(long totalSize) {
this.totalSize = totalSize;
}
public long getBytesRead() {
return bytesRead;
}
public String getBytesReadFormated() {
return FileUtils.byteCountToDisplaySize(bytesRead);
}
public void setBytesRead(long bytesRead) {
this.bytesRead = bytesRead;
}
public long getElapsedTime() {
return elapsedTime;
}
public void setElapsedTime(long elapsedTime) {
this.elapsedTime = elapsedTime;
}
public int getPercent() {
if (totalSize > 0)
return Math.round(bytesRead * 100 / totalSize);
else return 0;
}
public boolean isInProgress() {
return "progress".equals(status) || "start".equals(status);
}
public int getFileIndex() {
return fileIndex;
}
public void setFileIndex(int fileIndex) {
this.fileIndex = fileIndex;
}
}