欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

采用servlet 3.0 , 我是这样来完成图片上传及相关图片操作的;

程序员文章站 2022-07-16 09:20:52
...
		<dependency>
			<groupId>commons-io</groupId>
			<artifactId>commons-io</artifactId>
			<version>2.4</version>
		</dependency>

		<dependency>
			<groupId>commons-fileupload</groupId>
			<artifactId>commons-fileupload</artifactId>
			<version>1.3.1</version>
		</dependency>

之前是采用上面两个第三方jar包来完成文件上传工作的,代码相对比较繁琐;无意间看了片文章说servlet 3.0支持文件上传,于是就尝试了下;先来看servlet3.0提供的几种方法,而后进入实操:

1.HttpServletRequest提供的方法

Part getPart(String name):根据名称获取文件上传域
Collection<Part> getParts():获取所有的文件上传域

2.Part中常用的方法

String getContentType():获取上传文件的文件类型
long getSize():上传文件的大小
String getSubmittedFileName():上传文件的原始文件名
String getName():获取<input name="upload" ...>标签中name属性值
String getHeader(String name):获取请求头部
Collection<String> getHeaderNames():获取所有请求头部名称
InputStream getInputStream():获取上传文件的输入流
void write(String path):保存文件至服务器

3.表单enctype属性说明

在使用标签时,需要设置enctype=“multipart/form-data”,指定表单数据的编码方式。enctype属性值说明:

application/x-www-form-urlencoded:默认编码方式,只处理表单中的value属性值,这种编码方式会将表单中的值处理成URL编码方式
multipart/form-data:以二进制流的方式处理表单数据
text/plain:当表单action属性为mailto:URL形式时比较方便,适用于直接通过表单发送邮件方式

[email protected]fig注解属性说明 : 声明后的Servlet,既可以实现单个文件上传,也可以实现多个文件上传,同时还支持获取表单中的其他指字段.

属性 类型 是否必需
maxFileSize long 否
maxRequestSize long 否
fileSizeThreshold int 否
location String 否

========================

下面进入实操

  1. 前端html部分
<form action="../test" method="post" enctype="multipart/form-data">
分类名称:<input type="text" id="categoryName" name="categoryName" class="form-control"/>
分类图片:<input type="file" accept="image/*" id="categoryPic" name="filePath" />
<input type="submit" id="submit" value="上传图片" class="btn btn-success">
</form>
  1. js部分
function uploadClick() {
	$("#submit").click(function() {
				// 分类名称,去除首位空格后的为空判断();
				var categoryName = $("#categoryName").val();
				categoryName = $.trim(categoryName); // 去除首位空格;
				if (1 > categoryName.length) {
					alert("请输入分类名称后再提交!")
					return false;
				}

				// 上传文件未选择判断
				if (1 > $("#categoryPic").val().length) { 
					alert("请选择文件后,再提交!");
					return false;
				}

				// 文件大小限制;
				var categoryPicSize = $("#categoryPic")[0].files[0].size
				if (500 < categoryPicSize) {
					alert("上传文件大小超过500k!");
					return false; 
				}

			})
  1. servlet部分
@MultipartConfig(maxFileSize = 500, fileSizeThreshold = 1024 * 1024)
public class TestUploadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) {
		String savePath = req.getServletContext().getRealPath("img/category");
		{
			File addDir = new File(savePath); 
			if (!addDir.exists()) {
				addDir.mkdirs();
			}
		}
		String fileName = System.currentTimeMillis() + ".jpg"; 

		try {
			Part part = req.getPart("filePath"); // // 获取part对象;
			part.write(savePath + File.separator + fileName);

			// 文件格式转换
			String fileType = part.getSubmittedFileName(); 
			if (!fileType.endsWith(".jpg")) { 
				File file = new File(savePath, fileName);
				BufferedImage img = ImageUtil.change2jpg(file);
				ImageIO.write(img, "jpg", file);
			// 文件尺寸调整
				ImageUtil.resizeImage(file, 50, 50, file); 
			}
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ServletException e) {
			e.printStackTrace();
		}
  1. Util图片工具类
package util;

import java.awt.Image;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.DataBuffer;
import java.awt.image.DataBufferInt;
import java.awt.image.DirectColorModel;
import java.awt.image.PixelGrabber;
import java.awt.image.Raster;
import java.awt.image.RenderedImage;
import java.awt.image.WritableRaster;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class ImageUtil {
    public static BufferedImage change2jpg(File f) {
        try {
            Image i = Toolkit.getDefaultToolkit().createImage(f.getAbsolutePath());
            PixelGrabber pg = new PixelGrabber(i, 0, 0, -1, -1, true);
            pg.grabPixels();
            int width = pg.getWidth(), height = pg.getHeight();
            final int[] RGB_MASKS = {0xFF0000, 0xFF00, 0xFF};
            final ColorModel RGB_OPAQUE = new DirectColorModel(32, RGB_MASKS[0], RGB_MASKS[1], RGB_MASKS[2]);
            DataBuffer buffer = new DataBufferInt((int[]) pg.getPixels(), pg.getWidth() * pg.getHeight());
            WritableRaster raster = Raster.createPackedRaster(buffer, width, height, width, RGB_MASKS, null);
            BufferedImage img = new BufferedImage(RGB_OPAQUE, raster, false, null);
            return img;
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return null;
        }
    }

    public static void resizeImage(File srcFile, int width, int height, File destFile) {
        try {
            Image i = ImageIO.read(srcFile);
            i = resizeImage(i, width, height);
            ImageIO.write((RenderedImage) i, "jpg", destFile);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public static Image resizeImage(Image srcImage, int width, int height) {
        try {

            BufferedImage buffImg = null;
            buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            buffImg.getGraphics().drawImage(srcImage.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);

            return buffImg;
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }
}

新手上路 , 如果有更好或不妥的地方,请多多指教 !

相关标签: servlet