java上传实例
一个简单的上传实例理解java上传原理
servlet代码
package com.liu.servlet;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.UUID;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import com.liu.entity.UploadManage;
import com.liu.service.UploadServiceImpl;
@WebServlet("/UploadServlet3")
public class UploadServlet3 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
//创建一个部件工厂
DiskFileItemFactory disk = new DiskFileItemFactory(1024*1024,new File("D:\\temp"));
//创建一个解析器
ServletFileUpload fileload = new ServletFileUpload(disk);
try {
//解析request
List<FileItem> list = fileload.parseRequest(request);
System.out.println("====================普通部件==========================");
FileItem fileitem = list.get(0);
String name2 = fileitem.getString("utf-8"); //获得普通部件的value值
System.out.println("上传者姓名:"+name2);
System.out.println("====================文件部件===========================");
FileItem fileitem2 = list.get(1);
String name = fileitem2.getName(); //获得文件部件的名称
System.out.println("上传文件名:"+name);
//处理IE浏览器获取的全路径
int index = name.lastIndexOf("\\");
if(index != -1) {
name = name.substring(index+1); //截取最后一个 \
}
//获取/WEB-INF/upload的绝对路径
String path = request.getServletContext().getRealPath("/WEB-INF/upload");
System.out.println("/WEB-INF/upload的绝对路径:"+path);
//文件名转换成哈希数 & Integer.MAX_VALUE 处理负数
int has = name.hashCode() & Integer.MAX_VALUE;
System.out.println("文件名转成哈希数:"+has);
//哈希数转化成16进制
String hex = Integer.toHexString(has);
System.out.println("哈希数转化至16进制:"+hex);
//输出16进制的前两个
char char1 = hex.charAt(0);
char char2 = hex.charAt(1);
//处理路径 @E:\Tools\\apache-tomcat-8.5.50\\webapps\\upload\WEB-INF\\upload\7\6\
path = path+"\\"+char1+"\\"+char2;
//处理文件夹
File dir = new File(path);
dir.mkdirs(); //创建多级文件夹
//UUID.randomUUID().toString() 产生一个32位的随机数 永远不会重复
//处理成一个唯一的文件名
String red = UUID.randomUUID().toString()+"_"+name;
//写入流
File file = new File(dir, red);
fileitem2.write(file);
//上传的文件路径
System.out.println("上传的文件路径"+dir+"\\"+red);
//保存到数据库中的路径 \4\9\34e0b208-c542-45fd-8678-c55ca2e05350_居家小清新美女4k壁纸_彼岸图网.jpg
String filepath = "\\"+char1+"\\"+char2+"\\"+red;
System.out.println("保存到数据库中的路径是:"+filepath);
UploadServiceImpl usi = new UploadServiceImpl();
UploadManage um = new UploadManage();
um.setUsername(name2);;
um.setUrl(filepath);
boolean row = usi.finInsertAll(um);
if(row == true) {
response.getWriter().write("上传成功");
List<UploadManage> list3 = usi.finSelect();
request.setAttribute("tupian", list3);
response.sendRedirect("tupian.jsp");
}else {
response.getWriter().write("上传失败");
}
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
index.jsp代码:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="UploadServlet3" enctype="multipart/form-data" method="post">
<table>
<tr>
<td>姓名:</td>
<td><input type="text" name="user"/></td>
</tr>
<tr>
<td>选择图片:</td>
<td><input type="file" name="nfile"/></td>
</tr>
<tr>
<td><input type="submit" value="提交"/></td>
</tr>
</table>
</form>
</body>
</html>