写的第一篇博客,小菜鸟的成长之路—尽请期待:
该篇思路:
1. 文件上传首先要借助第三方库–commons (而commons-fileupload使用依赖于commons-io),所以要去apache下载两个jar包,并导入到项目的lib目录下.
2. 可以根据commons的用户导向,使用commons-fileupload: —-固定使用步骤
// Create a factory for disk-based(物理硬盘) file items
DiskFileItemFactory factory = new DiskFileItemFactory();
// Configure a repository (to ensure a secure temp location is used)
ServletContext servletContext = this.getServletConfig().getServl`这里写代码片`etContext();
File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");
factory.setRepository(repository);
// Create a new file upload handler(处理器)
ServletFileUpload upload = new ServletFileUpload(factory);
// Parse the request
List<FileItem> items = upload.parseRequest(request);
- 在web页面要指定form表单中方法为post(若上传为图片,则会转化为特殊字符,长度远远大于get方法范围), 且要指定消息头为multipart/form-data; 另外给input类型设为file,给个名字:
<form action="RegServlet" method="post" enctype="multipart/form-data">
头 像: <input type="file" name="photo"/><br/>
</form>
- 新建一个RegServlet文件, 按照2中的步骤进行书写;
- 先获取上传文件的后缀, 自动生成一个前缀,拼接一个要保存的wenjianming(目的:这样就不会重名了,毕竟用户上传的文件名什么情况都有,有可能都建123.jbg 若直接保存不加修改,文件就会重名,且不利于管理.)
- 获取输入流–将文件传进来
- 获取输出流–将文件传到指定路径( 需要获取要保存的路径,比如说项目中images所在的路径–String path = servletContext.getRealPath(“/images”); //查询images真正的地址)
8.将注册界面 用户输入信息(包括上传文件–头像图片),保存到数据库, 需要进行判断,用.equels相应的属性名,并赋值;(上传文件可值上传文件名, 路径名不写);然后保存到数据库—下边有详细代码 - 要将用户上传文件显示(如:头像),只要在用户显示视图界面–使用EL, 并拼接路径即可( )
- 然后就OVER了!
@WebServlet("/RegServlet") //这是比以前新用的技术--注解; 这样就不用再写繁琐的web.xml配置文件了.
public class RegServlet extends HttpServlet{
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException,ServletException {
//如果是文件上传的form, 不能再使用普通这种方法获取参数
//String name = request.getParameter("username");
//System.out.println(name);
// Create a factory for disk-based(物理硬盘) file items
DiskFileItemFactory factory = new DiskFileItemFactory();
// Configure a repository (to ensure a secure temp location is used)
ServletContext servletContext = this.getServletConfig().getServletContext();
File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");
factory.setRepository(repository);
// Create a new file upload handler(处理器)
ServletFileUpload upload = new ServletFileUpload(factory);
// Parse(解析) the request (将request传过来,upload对象会进行解析)
try {
User user = new User();
//文本框叫文本域, file类型的form,一个输入框叫做一个文件域
//解析时,会将所有的文件选项放到 list集合里边 ; 一个输入框就是一个文件域,一个FileItem
List<FileItem> items = upload.parseRequest(request);
for(FileItem item : items) {
if(item.isFormField()) { //普通的form 元素
String fileName = item.getFieldName() ;
String value = item.getString("utf-8");
if(fileName.equals("username")) { //对比下,找到对应的属性名, 将对应的属性值添加到对象中
user.setUsername(value);
}else if(fileName.equals("userpwd")) {
user.setUserpwd(value);
}else if(fileName.equals("email")) {
user.setEmail(value);
}else if(fileName.equals("address")) {
user.setAddress(value);
}else if(fileName.equals("hobby")) {
user.setHobby(value);
}
//System.out.println(fieldName+":"+value);
}else {
//文件对象元素
String fileName = item.getName(); //得到传入的文件名--目的是得到后缀
String suffix = fileName.substring(fileName.lastIndexOf('.')); //把后缀
UUID uuid = UUID.randomUUID(); // 随机生成一串16进制数--作为新文件名的前缀
String prefix = uuid.toString().replaceAll("-",""); //将数字转化为字符串,并将"-"替换为""
String saveFileName = prefix+suffix; //拼接新的文件名--为了系统保存,不会重复
user.setPhoto(saveFileName); //可将最后的文件名保存到数据库, 以后调用显示的时候可链接地址来用
//System.out.println(fileName);
//System.out.println(saveFileName);
//获取文件要保存的地址:
String path = servletContext.getRealPath("/images"); //查询images真正的地址
System.out.println(path);
InputStream is = item.getInputStream(); //获取输入流
// 输出流 指定将要保存的文件地址--地址是拼接的
OutputStream os = new FileOutputStream(new File(path+File.separator+saveFileName));
byte[] b = new byte[1024]; //文件的复制,粘贴 需要一个中间过度容器
int len;
while((len = is.read(b))!=-1) {
os.write(b, 0, len);
}
is.close();
os.close();
}
UserService userService = new UserServiceImpl();
boolean result = userService.save(user)>0;
if(result) {
response.sendRedirect("LoginPreServlet");
}
}
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}