All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.yixan.base.web.utils.RequestUploader Maven / Gradle / Ivy

There is a newer version: 3.7.1
Show newest version
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