可以验证file字段上传文件的格式大小是否正确
控制层用的SpringMVC框架,用MultipartFile接口file文件
验证用具类:
import java.util.ArrayList;
import java.util.List;
import org.springframework.web.multipart.MultipartFile;
import com.clou.douliu.server.bean.Pair;
/**
* 资源验证器
* @author dhh
* 2015-11-13
*
*/
public class ResourceValidator {
/**资源类型**/
public static final int IMAGE = 1;
public static final int AUDIO = 2;
public static final int VEDIO = 3;
/**相册照片最大大小 2M **/
private static final int MAX_IMAGE_SIZE = 2 * 1024 * 1024;
/**最大的音频类问题文件大小 1M **/
private static final int MAX_AUDIO_FILE_SIZE = 1 * 1024 * 1024;
/**最大的视频类问题文件大小 10M **/
private static final int MAX_VEDIO_FILE_SIZE = 10 * 1024 * 1024;
// 允许上传的图片类型
private static final List<String> allowImageTypeList;
private static final List<String> allowAudioTypeList;
private static final List<String> allowVedioTypeList;
static {
allowImageTypeList = new ArrayList<String>();
allowAudioTypeList = new ArrayList<String>();
allowVedioTypeList = new ArrayList<String>();
/**图片允许格式 **/
allowImageTypeList.add("image/bmp");
allowImageTypeList.add("image/png");
allowImageTypeList.add("image/gif");
allowImageTypeList.add("image/jpeg");
allowImageTypeList.add("image/x-png");
allowImageTypeList.add("image/pjpeg");
allowImageTypeList.add("image/jpg");
allowImageTypeList.add("image/*");
/**语音允许格式**/
allowAudioTypeList.add("audio/mp3");
allowAudioTypeList.add("application/octet-stream"); //amr
/**视频允许格式**/
allowVedioTypeList.add("video/mp4");
}
/**
* 是否是合法资源
* @param file 资源文件
* @param fileType 资源类型,分成3中,@see ResourceValidator 中的定义
* @return
*/
public static Pair<Boolean,String> isValidResouce(MultipartFile file , Integer fileType){
//检查file是否合法
Boolean valid = false;
if(file.getName() == null && file.getName().equals("")){
return Pair.makePair(valid, "文件名不能为空");
}
if(fileType == IMAGE){
if(!filterType(file.getContentType(),allowImageTypeList)){
return Pair.makePair(valid, "图片格式不允许");
}
if(!filterFileSize(file , MAX_IMAGE_SIZE)){
return Pair.makePair(valid, "图片大小不能超过" + (MAX_IMAGE_SIZE/1024) + "K");
}
}else if (fileType == AUDIO){
if(!filterType(file.getContentType(),allowAudioTypeList)){
return Pair.makePair(valid, "语音格式不允许");
}
if(!filterFileSize(file , MAX_IMAGE_SIZE)){
return Pair.makePair(valid, "语音大小不能超过" + (MAX_AUDIO_FILE_SIZE/1024) + "K");
}
}else if(fileType == VEDIO){
if(!filterType(file.getContentType(),allowVedioTypeList)){
return Pair.makePair(valid, "视频格式不允许");
}
if(!filterFileSize(file , MAX_IMAGE_SIZE)){
return Pair.makePair(valid, "视频大小不能超过" + (MAX_VEDIO_FILE_SIZE/1024) + "K");
}
}
valid = true;
return Pair.makePair(valid, "合法资源");
}
private static boolean filterType(String type ,List<String> library) {
for (String temp : library) {
if (temp.equals(type)){
return true;
}
}
return false;
}
/**
* 过滤图片的大小
* @param multipartFile
* @return
*/
private static boolean filterFileSize(MultipartFile multipartFile , Integer size) {
if(multipartFile.getSize() <0 || multipartFile.getSize() > size){
return false;
}
return true;
}
}
import java.io.Serializable;
/**
* 值对
* 方法需要返回两个值时,可使用Pair减少代码量
* @author rabbit
*
* @param <F>
* @param <S>
*/
public final class Pair<F, S> implements Serializable
{
private static final long serialVersionUID = 1L;
public F first;
public S second;
public Pair(F f, S s)
{
this.first = f;
this.second = s;
}
/**
* 通过值创建值对
* @param <FT>
* @param <ST>
* @param f
* @param s
* @return
*/
public static <FT, ST> Pair<FT, ST> makePair(FT f, ST s)
{
return new Pair<FT, ST>(f, s);
}
private static <T> boolean eq(T o1, T o2)
{
return o1 == null ? o2 == null : o1.equals(o2);
}
@SuppressWarnings("unchecked")
public boolean equals(Object o)
{
Pair<F, S> pr = (Pair<F, S>) o;
if(pr == null)
return false;
return eq(first, pr.first)
&& eq(second, pr.second);
}
private int h(Object o)
{
return o == null ? 0 : o.hashCode();
}
public int hashCode()
{
int seed = h(first);
seed ^= h(second) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
return seed;
}
@Override
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("first=").append(first).append(".\t").append("second=").append(second);
return sb.toString();
}
}
附录:
控制层SpringMVC的接口代码
/**
* 环信推送
* @param broadcastBean
* @param request
* @param response
* @param map
* @return
*/
@RequestMapping(value = "addEasemobPushTask.do")
@ResponseBody
public AjaxResponseBean addEasemobPushTask(
@ModelAttribute EasemobPushBean pushBean,
HttpServletRequest request, HttpServletResponse response, ModelMap map) {
// 得到当前session中的用户
User user = this.getUserInSession(request);
// 权限验证
boolean flag = PermissionCheck.check(user, FinalValues.MAJIA_OPERATION_PERMISSION);
if (!flag) {
// 没有权限
return AjaxResponseBean.getNoPermissionResponseBean();
}
try {
// 将查询出的结果返回给客户端,
Pair<Integer, String> result = this.businessFactory.broadcastBusiness.addEasemobPushTask(pushBean);
Integer count = result.first;
if(count > 0){
return AjaxResponseBean.getAjaxResponseBean(AjaxResponseBean.DWZ_STATUSCODE_OK, "添加【" + count +"】条推送任务成功");
}else{
return AjaxResponseBean.getAjaxResponseBean(AjaxResponseBean.DWZ_STATUSCODE_ERROR, result.second);
}
} catch (Exception e) {
logger.error("添加推送任务失败" + e.getMessage());
e.printStackTrace();
return AjaxResponseBean.getErrorResponseBean();
}
}
实体bean:
public class EasemobPushBean implements Serializable{
private static final long serialVersionUID = 1L;
private Integer msgType; //消息类型
private MultipartFile receivedExcelFile; //excel为接受者id
private Integer sendId ; //发送者ID
private Integer minTime; //延迟最小时间
private Integer maxTime; //延迟最大时间
//富文本消息
private String content;
//图文链接消息
private String linkTitle;
private String linkAddr;
private String linkContent;
private MultipartFile linkImages; //图片文件
//图片消息
private MultipartFile images; //图片文件
//语音消息
private MultipartFile audios; //音频文件
//视频消息
private MultipartFile videos; //视频文件
private MultipartFile videosShot; //视频文件缩略图
}