com.yixan.base.web.utils.RequestUploader Maven / Gradle / Ivy
package com.yixan.base.web.utils;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map.Entry;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import com.yixan.base.common.api.file.service.IFileService;
import com.yixan.base.common.error.ErrorCode;
import com.yixan.base.core.exception.ServiceException;
import com.yixan.tools.common.util.StringUtil;
import com.yixan.tools.common.util.VerifyUtil;
/**
* 文件上传处理
*
* @author zhaohuihua
* @version V1.0 2016年2月18日
*/
public class RequestUploader {
private IFileService fileService;
public RequestUploader(IFileService fileService) {
this.fileService = fileService;
}
/**
* 发现并上传文件
* 每个需要上传的文件, 在前端构建两个input
* 一个type="file"用于上传文件流, 一个type="hidden", 用于保存修改前的图片地址; 用序号一一对应
* <p> <input type="file" name="files0"/> <input type="hidden" name="images0"/> <p>
* <p> <input type="file" name="files1"/> <input type="hidden" name="images1"/> <p>
* <p> <input type="file" name="files2"/> <input type="hidden" name="images2"/> <p>
* <p> <input type="file" name="files3"/> <input type="hidden" name="images3"/> <p>
* <p> <input type="file" name="files4"/> <input type="hidden" name="images4"/> <p>
* 后台调用findAndUploadFiles(request, "images", "files")查找图片
* 图片列表是有顺序的
* 因此如果5张图片, 其中1/2(序号从0开始)修改了, 那么仍然应该是5条记录
* 其中0/3/4的type="hidden"是原图片URL,type="file"为null, 1/2的type="hidden"是新图片的原URL,type="file"为新图片输入流
* images0/images1/images2/images3/images4=原图片URL; files1/files2=文件流
* 此时应将files1/files2上传至文件服务器, 取得URL, 替换到images1/images2的位置
*
* 另外, 如果文件直接上传至文件服务器而不通过JAVA服务器中转
* 那么在前端就已已经把images1/images2替换成新图片地址了
* 应将type="file"设为disabled, 相当于每次type="file"都为null, 然后这个处理逻辑也就没有问题, 可以兼容了
*
* @param request
* @param imageFieldPrefix 图片字段的前缀
* @param fileFieldPrefix 文件字段的前缀
* @return 上传后的图片地址
* @throws ServiceException
*/
public List findAndUploadFiles(HttpServletRequest request, String imageFieldPrefix,
String fileFieldPrefix) throws ServiceException {
int size = 100;
int max = -1;
String[] urls = new String[size];
for (int i = 0; i < size; i++) {
// images0, images3, images4 原图片URL
String url = request.getParameter(imageFieldPrefix + i);
if (VerifyUtil.isNotBlank(url)) {
urls[i] = url;
if (max < i) {
max = i;
}
}
}
if (request instanceof MultipartHttpServletRequest) {
MultipartHttpServletRequest mrequest = (MultipartHttpServletRequest) request;
for (Entry entry : mrequest.getFileMap().entrySet()) {
if (entry.getKey().startsWith(fileFieldPrefix)) {
// files1, files2 文件流
String suffix = entry.getKey().substring(fileFieldPrefix.length());
if (VerifyUtil.isNotBlank(suffix) && StringUtil.isDigit(suffix)) {
int i = Integer.valueOf(suffix);
if (i < size && entry.getValue().getSize() > 0) {
urls[i] = upload(entry.getValue());
}
if (max < i) {
max = i;
}
}
}
}
}
List list = new ArrayList<>();
for (int i = 0; i <= max; i++) {
list.add(urls[i]);
}
return list;
}
protected String upload(MultipartFile file) throws ServiceException {
String name = file.getOriginalFilename();
long fileSize = file.getSize();
if (file == null || fileSize == 0 || VerifyUtil.isBlank(name) || VerifyUtil.isBlank(file.getName())) {
return null;
}
InputStream input;
try {
input = file.getInputStream();
} catch (IOException e) {
throw new ServiceException(ErrorCode.FILE_UPLOAD_ERROR, e);
}
return fileService.upload(name, input, fileSize);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy