采用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 否
========================
下面进入实操
- 前端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>
- 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;
}
})
- 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();
}
- 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;
}
}
新手上路 , 如果有更好或不妥的地方,请多多指教 !
上一篇: 我就是懒的要命