java servlet上传图片

网上找了一些都有点问题,后面找到一个作者的比较科学,贴上代码
需要的两个jar包
链接: https://pan.baidu.com/s/1JSdOj_AtitZ2FKLQ-2OJXQ 提取码: u5px
如果在tomcat上运行记得把两个包放进lib下,不然tomcat会报错

package com.demo.servlet;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.List;
import java.util.UUID;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadBase;
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.FilenameUtils;



public class uploadImg extends HttpServlet {
	private String message;

	public void init() throws ServletException {

	}

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String rpath = null;
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out = response.getWriter();
		System.out.print(request.getRemoteAddr());
		boolean isMultipart = ServletFileUpload.isMultipartContent(request);
		if (!isMultipart) {
			throw new RuntimeException(
					"请检查您的表单的enctype属性,确定是multipart/form-data");
		}
		DiskFileItemFactory dfif = new DiskFileItemFactory();
		ServletFileUpload parser = new ServletFileUpload(dfif);

		parser.setFileSizeMax(3 * 1024 * 1024);// 设置单个文件上传的大小
		parser.setSizeMax(6 * 1024 * 1024);// 多文件上传时总大小限制

		List<FileItem> items = null;
		try {
			items = parser.parseRequest(request);
		} catch (FileUploadBase.FileSizeLimitExceededException e) {
			out.write("上传文件超出了3M");
			return;
		} catch (FileUploadBase.SizeLimitExceededException e) {
			out.write("总文件超出了6M");
			return;
		} catch (FileUploadException e) {
			e.printStackTrace();
			throw new RuntimeException("解析上传内容失败,请重新试一下");
		}

		// 处理请求内容
		if (items != null) {
			for (FileItem item : items) {
				if (item.isFormField()) {
					processFormField(item);
				} else {
					rpath = processUploadField(item);
				}
			}
		}

		out.write(rpath);

	}

	private String processUploadField(FileItem item) {
		String rpath = null;
		try {
			String fileName = item.getName();

			// 用户没有选择上传文件时
			if (fileName != null && !fileName.equals("")) {
				fileName = UUID.randomUUID().toString() + "_"
						+ FilenameUtils.getName(fileName);

				// 扩展名
				String extension = FilenameUtils.getExtension(fileName);
				// MIME类型
				String contentType = item.getContentType();

				// 分目录存储:日期解决
				// Date now = new Date();
				// DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
				//
				// String childDirectory = df.format(now);

				// 按照文件名的hashCode计算存储目录
				String childDirectory = makeChildDirectory(getServletContext()
						.getRealPath("/WEB-INF/files/"), fileName);

				String storeDirectoryPath = getServletContext().getRealPath(
						"/images/" + childDirectory);
                  //返回的图片地址
	    			rpath = "www.xxxxxxx.com"  + childDirectory
						+ fileName;
				System.out.println(rpath);

				File storeDirectory = new File(storeDirectoryPath);
				if (!storeDirectory.exists()) {
					storeDirectory.mkdirs();
				}

				// System.out.println(fileName);
				item.write(new File(storeDirectoryPath + File.separator
						+ fileName));// 删除临时文件

			}
		} catch (Exception e) {
			throw new RuntimeException("上传失败,请重试");
		}
		return rpath;

	}

	// 计算存放的子目录
	private String makeChildDirectory(String realPath, String fileName) {
		int hashCode = fileName.hashCode();
		int dir1 = hashCode & 0xf;// 取1~4位
		int dir2 = (hashCode & 0xf0) >> 4;// 取5~8位

		String directory = "" + dir1 + '/' + dir2 + '/';
		File file = new File(realPath, directory);
		if (!file.exists())
			file.mkdirs();

		return directory;
	}

	private void processFormField(FileItem item) {
		String fieldName = item.getFieldName();// 字段名
		String fieldValue;
		try {
			fieldValue = item.getString("UTF-8");
		} catch (UnsupportedEncodingException e) {
			throw new RuntimeException("不支持UTF-8编码");
		}
		System.out.println(fieldName + "=" + fieldValue);

	}

	// 结束
	public void destroy() {

	}

}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值