package org.hadatac.console.http;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import play.mvc.Http.Request;
public class ResumableUpload {
public static boolean uploadFileByChunking(Request request, String baseDir) {
int nResumableChunkNumber = getResumableChunkNumber(request);
ResumableInfo info = getResumableInfo(request, baseDir);
if (info.uploadedChunks.contains(new ResumableInfo.ResumableChunkNumber(nResumableChunkNumber))) {
return true;
}
return false;
}
public static boolean postUploadFileByChunking(Request request, String baseDir) {
int nResumableChunkNumber = getResumableChunkNumber(request);
ResumableInfo info = getResumableInfo(request, baseDir);
try {
RandomAccessFile raf = new RandomAccessFile(info.resumableFilePath, "rw");
//Seek to position
raf.seek((nResumableChunkNumber - 1) * (long)info.resumableChunkSize);
//Save to file
byte[] bytes = request.body().asRaw().asBytes();
if (bytes != null) {
int read = 0;
int write_size = 950 * 100;
while (read < bytes.length) {
raf.write(bytes, read, Math.min(write_size, bytes.length - read));
read += Math.min(write_size, bytes.length - read);
}
}
raf.close();
} catch (IOException e) {
e.printStackTrace();
}
info.uploadedChunks.add(new ResumableInfo.ResumableChunkNumber(nResumableChunkNumber));
if (info.checkIfUploadFinished()) { //Check if all chunks uploaded, and change filename
ResumableInfoStorage.getInstance().remove(info);
return true;
} else {
return false;
}
}
private static int getResumableChunkNumber(Request request) {
return HttpUtils.toInt(request.getQueryString("resumableChunkNumber"), -1);
}
private static ResumableInfo getResumableInfo(Request request, String base_dir) {
int resumableChunkSize = HttpUtils.toInt(request.getQueryString("resumableChunkSize"), -1);
long resumableTotalSize = HttpUtils.toLong(request.getQueryString("resumableTotalSize"), -1);
String resumableIdentifier = request.getQueryString("resumableIdentifier");
String resumableFilename = request.getQueryString("resumableFilename");
String resumableRelativePath = request.getQueryString("resumableRelativePath");
//Here we add a ".temp" to every upload file to indicate NON-FINISHED
File folder = new File(base_dir);
if (!folder.exists()){
folder.mkdirs();
}
String resumableFilePath = new File(base_dir, resumableFilename).getAbsolutePath() + ".temp";
ResumableInfoStorage storage = ResumableInfoStorage.getInstance();
ResumableInfo info = storage.get(resumableChunkSize, resumableTotalSize,
resumableIdentifier, resumableFilename, resumableRelativePath, resumableFilePath);
if (!info.vaild()) {
storage.remove(info);
}
return info;
}
}