上传图片到服务器_javaweb

版权声明: https://blog.csdn.net/baidu_41671472/article/details/82148968
首先先写一个工具类——uploadutils
package login_pack.utils;
import java.util.UUID;
/*
    文件上传的工具类
* */
public class uploadutils {
    /*
    UUID 生成随机的字符串
    生成唯一的文件名:
    * */
    public static String getUUIDFileName(String filename){
        //由于UUID随机生成字符串,可能有我们不需要的字符例如"-"等
        //将文件名的前面部分进行截取:xx.jpg  ----> .jpg
        int idx = filename.lastIndexOf(".");//获取" . "的位置
        String extention = filename.substring(idx);//得到文件的扩展名
        String uuidfilename = UUID.randomUUID().toString().replace("-","") + extention;//将随机的字符串中的" - " 替换为 ""空,就是去掉" - "
        return uuidfilename;
    }
}

然后开始写文件读写

//通过工具类获得唯一的文件名 utils 里面的 uploadutils 类
String uuidFileName = uploadutils.getUUIDFileName(filename);
//获得文件上传的数据
InputStream is = fileItem.getInputStream();
//获得文件上传的路径
String path = this.getServletContext().getRealPath("/upload");
//将输入流对接到输出流
String url = path + "\\" + uuidFileName;
OutputStream os = new FileOutputStream(url);
int len = 0;
byte[] b = new  byte[1024];
while ((len = is.read(b)) != -1)
{
    os.write(b, 0, len);
}
is.close();
os.close();

写一个uploadutils类是为了防止存储路径有文件的文件名相同,导致文件写入失败。然后通过io流写入写出文件。

用处:
      做网站搭建的时候,可以通过这种方式去存储用户上传的头像到本服务器上。

例子:

regist.jsp文件
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>注册</title>
<link rel="stylesheet" href="./css/reg.css">
</head>
<body>
    <div class="reg">
        <div class="header">
            <h1>
                <a href="./login.jsp">登录</a> <a href="./regist.jsp">注册</a>
            </h1>
        </div>
        <!--
        文件上传到条件:
            1. 表单必须是post提交方式
            2. 表单中必须由问价你上传项,问价上传必须由name属性和值。文件上传项就是type = “file”
            3. 表单拿到enctype属性必须设置为multipart/form-data
         -->
        <%
            String path = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()  + request.getServletContext().getContextPath();
                          //动态的获取  协议名“http”或者其他 , 获取 ip地址  , 获取端口号  , 获取工程名
        %>
        <form action="<%= path%>//registsevlet" method="post" enctype="multipart/form-data">
            <table>
                <tr>
                    <td class="td1">用户名</td>
                    <td><input type="text" class="input1" name="username"></td>
                </tr>
                <tr>
                    <td class="td1">密码</td>
                    <td><input type="password" class="input1" name="password"></td>
                </tr>
                <tr>
                    <td class="td1">昵称</td>
                    <td><input type="text" class="input1" name="nickname"></td>
                </tr>
                <tr>
                    <td class="td1">性别</td>
                    <td>
                        <input type="radio" name="sex" value="male"><input type="radio" name="sex" value="female"></td>
                </tr>
                <tr>
                    <td class="td1">上传头像</td>
                    <td><input type="file" id="photo" name="upload"></td>
                </tr>
                <tr>
                    <td class="td1">兴趣爱好</td>
                    <td><label> 
                        <input type="checkbox" name="hobby" value="篮球">篮球
                        <input type="checkbox" name="hobby" value="足球">足球
                        <input type="checkbox" name="hobby" value="排球">排球 
                        <input type="checkbox" name="hobby" value="羽毛球">羽毛球
                    </label></td>
                </tr>
                <tr>
                    <td colspan="2">
                        <div class="btn-red">
                            <input type="submit" value="注册" id="reg-btn">
                        </div>
                    </td>
                </tr>
            </table>
        </form>
    </div>
</body>
</html>
registservlet.java文件
package login_pack.servlet;

import org.apache.catalina.User;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

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 java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import login_pack.user;
import login_pack.utils.uploadutils;

@WebServlet(name = "registsevlet")
public class registsevlet extends HttpServlet {
    //完成用户注册的servlet
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //数据的接收
        //文件上传的基本操作:
        try {
            // 获得servletcontext对象:
            List<user> uselist = (List<user>) this.getServletContext().getAttribute("list");//在initservlet中,servletcontext中设置了一个list集合 ps.这里要强制类型转换一下

            // 定义一个map集合,用于保存接收到的 name  passward
            Map<String,String> map = new HashMap<String, String>();
            //      1. 创建一个磁盘文件项工程对象
            DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
            //      2. 创捷一个核心类
            ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
            //      3. 解析request请求,返回的是list集合,存的是fileitem对象
            List<FileItem> list =  servletFileUpload.parseRequest(request);
            //定义一个list集合,用于保存兴趣爱好数据
            List<String> hobbyList = new ArrayList<String>();
            //      4.遍历集合,获得每个fileitem,判断是表单项还是文件上传项

            String url = "";
            for (FileItem fileItem : list)
            {
                if (fileItem.isFormField())
                {//普通表单项
                    //接收表单项参数的值
                    String name = fileItem.getFieldName();//获得表单项的name值
                    String value = fileItem.getString("UTF-8");
                    if("hobby".equals(name)) {//判断是否是复选表单项
                        String hobbyValue = fileItem.getString("UTF-8");
                        //接收到一个值,就这个值存到hobbyList中
                        hobbyList.add(hobbyValue);
                        hobbyValue = hobbyList.toString().substring(1, hobbyList.toString().length() - 1);
                        //讲爱好数据存入到mao集合中
                        map.put(name, hobbyValue);
                    }else {
                        //如果不用map集合存储对应的name,password 的值,第二次循环就会覆盖上一次循环的值,就从name 变成了 password
                        //将数据存到map集合中
                        map.put(name, value);
                    }
                }else {
                    //文件上传项:
                    //文件上传功能
                    //获得文件上传的名称:
                    String filename = fileItem.getName();
                    if (filename != null && !filename.equals(""))
                    {
                        //通过工具类获得唯一的文件名 utils 里面的 uploadutils 类
                        String uuidFileName = uploadutils.getUUIDFileName(filename);
                        //获得文件上传的数据
                        InputStream is = fileItem.getInputStream();
                        //获得文件上传的路径
                        String path = this.getServletContext().getRealPath("/upload");
                        //将输入流对接到输出流
                        url = path + "\\" + uuidFileName;
                        OutputStream os = new FileOutputStream(url);
                        int len = 0;
                        byte[] b = new  byte[1024];
                        while ((len = is.read(b)) != -1)
                        {
                            os.write(b, 0, len);
                        }
                        is.close();
                        os.close();
                    }
                    else {
                        request.setAttribute("nopicture", "请存入头像");
                        request.getRequestDispatcher("/regist.jsp").forward(request, response);
                        return;
                    }
                }
            }
            //校验用户名,如有重复则不允许添加
            for(user u:uselist){
                if (u.getUsername().equals(map.get("username"))){
                    request.setAttribute("msg", "用户名已存在");
                    request.getRequestDispatcher("/regist.jsp").forward(request, response);
                    return ;
                }
            }
            //注册到的信息存储到 user中
            user use = new user();
            use.setUsername(map.get("username"));
            use.setPassword(map.get("password"));
            use.setNickname(map.get("nickname"));
            use.setSex(map.get("sex"));
            use.setHobby(map.get("hobby"));
            use.setPath(url);
            //将注册用于的信息存入list集合中,initservlet中有一个user,list
             uselist.add(use);
            this.getServletContext().setAttribute("list", uselist);//更新context中list的值
            //存一个用于名
            request.getSessi().setAttribute("username", use.getUsername());
            //注册成功,跳转到登陆页面:
            response.sendRedirect(request.getContextPath() + "/login.jsp");
        }catch (FileUploadException  e){
            e.printStackTrace();
        }
    }

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

       }
}

猜你喜欢

转载自blog.csdn.net/baidu_41671472/article/details/82148968
今日推荐