/**
*
*/
package net.caiban.utils.upload;
import java.io.IOException;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import net.caiban.utils.upload.filter.AbstractUploadFilter;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartRequest;
import com.google.common.base.Strings;
import com.google.common.collect.Maps;
/**
* @author parox
*
*/
public abstract class AbstractUploader {
private String inputName;
final static String DEFAULT_INPUT="uploadfile";
public AbstractUploader(String inputName){
this.inputName = inputName;
}
protected abstract UploadResult putObject(MultipartFile file, String path,
String originalName, String resultName) throws IOException,
UploadException;
public UploadResult upload(MultipartFile file, String path,
String rename, AbstractUploadFilter filter) throws UploadException, IOException {
if(file==null){
throw new UploadException("MultipartFile unavailable.");
}
String originalName = file.getOriginalFilename();
if (Strings.isNullOrEmpty(originalName)) {
throw new UploadException("Empty name of uploaded file.");
}
if(filter!=null){
filter.filter(originalName);
}
String resultName = originalName;
if (!Strings.isNullOrEmpty(rename)) {
int start = originalName.lastIndexOf(".");
start = start == -1?0:start;
String suffix = originalName.substring(start, originalName.length());
suffix = suffix.startsWith(".")?suffix:"."+suffix;
resultName = rename + suffix;
}
if (!path.endsWith("/")) {
path = path + "/";
}
return putObject(file, path, originalName, resultName);
}
public Map<String, UploadResult> batchUpload(
HttpServletRequest request, String path, String rename,
AbstractUploadFilter filter){
MultipartRequest multipartRequest = (MultipartRequest) request;
Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
Map<String, UploadResult> resultMap = Maps.newHashMap();
int i=0;
for(String inputFileName: fileMap.keySet()){
try {
String renamePlus = null;
if(!Strings.isNullOrEmpty(rename)){
renamePlus = rename+"-"+String.valueOf(i+1);
i++;
}
UploadResult result = upload(fileMap.get(inputFileName), path, renamePlus, filter);
resultMap.put(inputFileName, result);
} catch (IOException e) {
UploadResult result = new UploadResult();
result.setError(e.getMessage());
resultMap.put(inputFileName, result);
} catch (UploadException e) {
UploadResult result = new UploadResult();
result.setError(e.getMessage());
resultMap.put(inputFileName, result);
}
}
return resultMap;
}
public MultipartFile getMultipartFile(HttpServletRequest request, String fileInputName){
MultipartRequest multipartRequest = (MultipartRequest) request;
if(Strings.isNullOrEmpty(fileInputName)){
Map<String, MultipartFile> map = multipartRequest.getFileMap();
for(String k: map.keySet()){
return map.get(k);
}
return null;
}else{
MultipartFile file = multipartRequest.getFile(fileInputName);
return file;
}
}
public MultipartFile getMultipartFile(HttpServletRequest request){
// if(Strings.isNullOrEmpty(inputName)){
// return getMultipartFile(request, DEFAULT_INPUT);
// }
return getMultipartFile(request, inputName);
}
public UploadResult upload(HttpServletRequest request,
String path) throws IOException, UploadException {
return upload(getMultipartFile(request), path, null, null);
}
public UploadResult upload(HttpServletRequest request,
String path, AbstractUploadFilter filter) throws IOException,
UploadException {
return upload(getMultipartFile(request), path, null, filter);
}
public Map<String, UploadResult> batchUpload(
HttpServletRequest request, String path){
return batchUpload(request, path, null, null);
}
public Map<String, UploadResult> batchUpload(
HttpServletRequest request, String path, String rename){
return batchUpload(request, path, rename, null);
}
public Map<String, UploadResult> batchUpload(
HttpServletRequest request, String path,
AbstractUploadFilter filter){
return batchUpload(request, path, null,filter);
}
}