SpringMVC上传图片与Servlet上传图片

前端表单
<form action="/upload/file" method="post" enctype="multipart/form-data">
	    <input type="file" name="file">
	    <input name="type" value="orther">
	    <button type="submit">提交</button>
</form>

 

 

  •   SpringMVC上传

 




import com.shangge.frameWork.config.DrivingConfig;
import com.shangge.frameWork.config.ServerConfig;
import com.shangge.frameWork.enums.PicType;
import com.shangge.frameWork.model.JsonBackData;
import com.shangge.util.FileUploadUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;


@Slf4j
@Controller
@RequestMapping("upload")
public class FileController {
    @Autowired
    private ServerConfig serverConfig;


  


    /**
     * 单一上传图片
     * @param file
     * @param type  上传图片的类型 例如头像等
     * @return
     * @throws IOException
     */
    @RequestMapping("/file")
    @ResponseBody
    public JsonBackData uploadFile(@RequestParam(value = "file") MultipartFile file,
                                   @RequestParam(value = "type")String type) throws IOException {
        JsonBackData json = new JsonBackData();

        //上传后返回的相对路径
        String path ="";

        //上传的图片路径
        String pic = "/upload/img";

        path = FileUploadUtils.upload(pic,file);
        Map<String,String> map = new HashMap<String,String>();
        map.put("path",path);//相对路径
        map.put("fullPath",serverConfig.getUrl() + path);//全路径
        json.setData(map);
        return  json;
    }







}

 




import java.io.*;
import java.time.LocalDateTime;
import java.util.UUID;
import com.shangge.frameWork.config.DrivingConfig;
import com.shangge.frameWork.exception.FileSizeLimitException;
import lombok.extern.slf4j.Slf4j;
import net.coobird.thumbnailator.Thumbnails;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.output.ByteArrayOutputStream;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.multipart.MultipartFile;



/**
 * 文件上传工具类

 */
@Slf4j
public class FileUploadUtils {






    /**
     * 根据文件路径上传
     * @param baseDir 相对应用的基目录
     * @param file 上传的文件
     * @return 返回上传成功的文件名
     * @throws FileSizeLimitException 超出最大大小
     * @throws IOException 读写文件出错
     */
    public static final String upload(String baseDir, MultipartFile file)
            throws FileSizeLimitException, IOException {
        try{

            String pathFileName = "";//返回的路劲

            //重命名文件名
            String orgFileName = file.getOriginalFilename();
            String dataUuid = DateUtil.formatYMTime(LocalDateTime.now())+"/" +UUID.randomUUID().toString().replaceAll("-","");
            String type =  FilenameUtils.getExtension(orgFileName);
            String fileMaster = dataUuid + "." + type; //主图地址

            File masterFile = getAbsoluteFile(baseDir, fileMaster);

            if(isImage(type)) {//如果是图片上传 再上传三种格式200x200 500x500 700x700

                String small = dataUuid+"_s"+"."+type;

                File sFile = getAbsoluteFile(baseDir, small);
                compressPicForSize(sFile,file.getBytes(),200);

                File mFile = getAbsoluteFile(baseDir, dataUuid+"_m"+"."+type);
                compressPicForSize(mFile,file.getBytes(),500);

                File lFile = getAbsoluteFile(baseDir, dataUuid+"_l"+"."+type);
                compressPicForSize(lFile,file.getBytes(),700);

                pathFileName = getPathFileName(baseDir, small);
            } else{//不是图片上传是其他文件上传例如pdf excel

                pathFileName = getPathFileName(baseDir, fileMaster);
            }

            file.transferTo(masterFile);//上传主文件地址



            return pathFileName;
        }
        catch (Exception e) {
            log.info(e.getMessage());
            throw new IOException(e.getMessage(), e);

        }

    }


    /**
     * 创建文件目录
     * @param uploadDir
     * @param fileName
     * @return
     * @throws IOException
     */
    private static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException
    {
        File file = new File(uploadDir + File.separator + fileName);
        if (!file.getParentFile().exists())
        {
            file.getParentFile().mkdirs();
        }
        if (!file.exists())
        {
            file.createNewFile();
        }
        return file;
    }

    /**
     * 返回相对路径
     * @param uploadDir
     * @param fileName
     * @return
     */
    private static final String getPathFileName(String uploadDir, String fileName) {
        int dirLastIndex = DrivingConfig.getProfile().length() + 1;
        String currentDir = StringUtils.substring(uploadDir, dirLastIndex);
        String pathFileName = DrivingConfig.getResourcePrefix() + "/" + currentDir + "/" + fileName;
        return pathFileName;
    }


    /**
     * 图片判断
     * @param type
     * @return
     */
    public static boolean isImage(String type) {
        String[] imageExtension = new String[]{"jpeg", "jpg", "gif", "bmp", "png"};
        for (String e : imageExtension)
            if (type.toLowerCase().equals(e))
                return true;

        return false;
    }


    /**
     *
     * @param file 图片文件
     * @param imageBytes
     * @param size 图片大小
     */
    public static void compressPicForSize(File file,byte[] imageBytes,int size) {
        try {
                ByteArrayInputStream inputStream = new ByteArrayInputStream(imageBytes);
                ByteArrayOutputStream outputStream = new ByteArrayOutputStream(imageBytes.length);
                Thumbnails.of(inputStream)
                        .size(size, size)
                        .toOutputStream(outputStream);
                imageBytes = outputStream.toByteArray();

            FileUtils.writeByteArrayToFile(file, imageBytes);
        } catch (Exception e) {
            log.error("【图片压缩】msg=图片压缩失败!", e);
        }
    }




}
  • servlet上传图片

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.IOUtils;
import com.angroid.js.JsonBackData;
import com.angroid.oa.module.ConfigHelper;
import com.angroid.oa.module.PicType;
import com.angroid.util.DateX;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;

@SuppressWarnings("serial")
public class UploadServlet extends HttpServlet{
	
	public String type ="";
	public String pic;
	public String path;
    @Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	request.setCharacterEncoding("UTF-8");
    	JsonBackData<String> json = new JsonBackData<String>();
    	//解决乱码问题
        
        
        response.setCharacterEncoding("utf-8");
        response.setContentType("application/json; charset=utf-8");
        PrintWriter out = null;
		DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
	        //设置缓冲区大小为10kb
	        diskFileItemFactory.setSizeThreshold(10240);
	        //创建上传组件
	        ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
	        //设置单个文件上传大小限制
	        servletFileUpload.setFileSizeMax(50*10240);
	        long maxSize = 50*10240;
	        try {
	            List<FileItem> list = servletFileUpload.parseRequest(request);
	            //System.out.println(list);
	            Iterator itr = list.iterator();
	            while (itr.hasNext()) { 
	            	FileItem item = (FileItem) itr.next();
	            	if(item.isFormField()) {//文本
	            		type = item.getString();//取得上传的文件类别属性值 比如 头像 合同之类的
	            	} else {//检验是否上传文件 与限制大小
	            		 if (item.getSize() == 0) {
	 	 					System.out.println("请正确上传文件");
	 	 					json.setCode(400);
	     		     		json.setMsg("请正确上传文件");
	     					out = response.getWriter();
	     					out.write(json.toString());
	     					out.flush();
	     					out.close();
	     					return ;
	 	 				}
	            		 if (item.getSize() > maxSize) {
	     					System.out.println("文件大小不能超过50M");
	     					json.setCode(400);
	     		     		json.setMsg("文件大小不能超过50M");
	     					out = response.getWriter();
	     					out.write(json.toString());
	     					out.flush();
	     					out.close();
	     					return ;
	     				}
	            	}
	            	
	            	
	            }
	            try {
	            	 pic = "/upload/img";
	            }catch (Exception e) {
	            	json.setCode(400);
		     		json.setMsg("程序出错了");
		            e.printStackTrace();
		        	out = response.getWriter();
					out.write(json.toString());
					out.flush();
					out.close();
					return ;
				}
	           
	            for(FileItem item : list){
	                //对item进行判断
	                if(item.isFormField()){ //如果是普通文本表单字段,返回一个true否则返回一个false。因此可以用该方法判断是否是普通表单域还是文件上传表单域。
	                    //不做处理
	                	//请上传文件
	                	// name = item.getFieldName();//文本的name属性 type
	                }else{
	                	path = pic;
	                    //获取输出流 
	                	pic = request.getServletContext().getRealPath("/")+pic;
	                	File dirFile = new File(pic);
	            		if (!dirFile.exists()) {
	            			dirFile.mkdirs();
	            		}
	    				String fileExt = item.getName().substring(item.getName().lastIndexOf("."));
	    				fileExt = DateX.geMonthtime()+fileExt;
	    				path = path +"/"+fileExt;//全路径
	    				pic = pic+"/"+fileExt;//返回给前端的相对路径
	    				json.setData(path);
	                    OutputStream os = new FileOutputStream(new File(pic));
	                    //将文件保存下来
	                    IOUtils.copy(item.getInputStream(),os);
	                }
	            }
	            json.setCode(200);
	            json.setMsg("上传成功");
	        	out = response.getWriter();
				out.write(json.toString());
				out.flush();
				out.close();
	        } catch (FileUploadException e) {
	        	json.setCode(400);
	     		json.setMsg("程序出错了");
	            e.printStackTrace();
	        	out = response.getWriter();
				out.write(json.toString());
				out.flush();
				out.close();
				return ;
	        }

		
    }
 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	
    	doPost(request,response);
    }

}


 


<!-- web.xml配置    -->


 <servlet>
        <servlet-name>upServlet</servlet-name>
        <servlet-class>xxx.UploadServlet</servlet-class>  <!-- 包路径    -->
    </servlet>
    <servlet-mapping>
        <servlet-name>upServlet</servlet-name>
        <url-pattern>/upload/file</url-pattern>
    </servlet-mapping>
	
所需2个包  commons-fileupload-1.4  commons-io-2.8.0

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值