文件上传

大白配小猪 2019-12-31

package com.oracle.upload;

import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.oracle.domain.ResponseUpload;
import com.oracle.domain.UploadBean;
import com.oracle.domain.UserInfo;
import com.oracle.service.UploadService;
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 org.apache.commons.io.FileUtils;

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.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

/**
 * @Description TODO
 * @ClassName UploadServlet
 * @Author YHY
 * @Date 2019/11/11 11:31
 * @Version V1.0
 */
@WebServlet(value = "/UploadServlet")
public class UploadServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /* 处理响应乱码问题:字节流需getBytes("UTF-8") */
        /*response.setContentType("text/html;charset=UTF-8");*/
        /* 处理post请求乱码问题 */
        request.setCharacterEncoding("UTF-8");

        String fileName = ""; //文件名*/
        String href = "";/*服务器存储路径*/
        String loaclhost_file_name = "";
        UserInfo userInfo = (UserInfo) request.getSession().getAttribute("userinfo");
        String upload_those = userInfo.getUid();
        String access_url = "";/*用户访问的相对路径*/

        /*用于返回数据*/
        Map map = new HashMap();

        boolean flag = ServletFileUpload.isMultipartContent(request);
        if (!flag) {
            request.setAttribute("msg", "表单的enctype属性不正确");
            request.getRequestDispatcher("jsp/upload.jsp").forward(request, response);
            return;
        }

        /*缓冲字节输出流*/
        BufferedOutputStream bos = null;
        /*缓冲字节输入流*/
        BufferedInputStream bis = null;

        /*1、创建磁盘文件工程*/
        DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
        /*设置文件上传过程中缓冲区的大小*/
        diskFileItemFactory.setSizeThreshold(3);
        /*设置文件上传过程中超出缓冲区所产生的临时文件路径*/
        diskFileItemFactory.setRepository(new File("D://temporary"));
        /*2、创建一个核心解析类*/
        ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
        /*解决中文乱码问题*/
        servletFileUpload.setHeaderEncoding("UTF-8");

        /*3、利用核心类解析request,解析后得到多个部分。返回list集合。list集合中装的值每个部分内容(FileItem文件项)。*/
        try {
            List<FileItem> fileItems = servletFileUpload.parseRequest(request);

            /*4、遍历list集合,会得到代表每个部分的文件上传项的对象。根据文件项判断是否是文件上传项。*/
            for (FileItem f : fileItems) {
                /*判断这个文件项是普通项还是文件上传项*/
                if (f.isFormField()) {
                    /*普通项:*/
                    /*接收普通项的值,不能用request.getParameter()*/
                    /*获取普通项的key*/
                    String name = f.getFieldName();
                    /*接收普通项的值*/
                    String string = f.getString();
                    System.out.println(name + ":" + string);
                    if (name.equals("href")) {
                        href = string;
                    }
                    if (name.equals("access_url")) {
                        access_url = string;
                    }
                }
            }
            /*文件上传项*/
            for (FileItem file : fileItems) {
                if (!file.isFormField()) {
                    /*文件上传项*/
                    /*获取文件名*/
                    loaclhost_file_name = file.getName();
                    fileName = loaclhost_file_name;
                    int index = 0;
                    if ((index = fileName.lastIndexOf("\\")) != -1) {
                        loaclhost_file_name = loaclhost_file_name.substring(index + 1);
                    }
                    loaclhost_file_name = UploadServlet.randomFileNanm(loaclhost_file_name);
                    /*往request域中存储文件名*/
                    request.setAttribute("randomFileName", loaclhost_file_name.getBytes());
                    /*获取数据源*/
                    bis = new BufferedInputStream(file.getInputStream());

                    /*服务器存储路径*/
                    href = href + loaclhost_file_name;
                    /*用户访问的相对路径*/
                    access_url = access_url + loaclhost_file_name;

                    /*明确数据源*/
                    bos = new BufferedOutputStream(new FileOutputStream(href));
                    byte[] bytes = new byte[1024];
                    int line = 0;
                    while ((line = bis.read(bytes)) != -1) {
                        bos.write(bytes, 0, line);
                    }
                    if (bos != null && bis != null) {
                        /*释放资源*/
                        bos.close();
                        bis.close();
                    }
                    /*5、删除临时文件*/
                    file.delete();

                    FileUtils.copyFile(new File("D:\\Java\\apache-tomcat-9.0.27\\webapps\\YHY\\images\\xishi\\" + loaclhost_file_name),
                            new File("D:\\YHY\\web\\images\\xishi\\" + loaclhost_file_name));


                    /*调用sevice方法*/
                    /*封装参数*/
                    UploadBean uploadBean = new UploadBean();
                    uploadBean.setName(fileName);
                    uploadBean.setLoaclhost_file_name(loaclhost_file_name);
                    uploadBean.setUpload_those(upload_those);
                    uploadBean.setAccess_url(access_url);
                    uploadBean.setHref(href);
                    new UploadService().insertUpload(uploadBean);

                    map.put("code", "0");
                    map.put("msg", "成功");
                    map.put("url", "url");
                }
            }
        } catch (FileUploadException e) {
            map.put("code", "500");
            map.put("msg", "失败");
            map.put("url", "url");
            e.printStackTrace();
        } finally {
            if (bos != null && bis != null) {
                /*释放资源*/
                bos.close();
                bis.close();
            }
        }
        response.getWriter().write(new Gson().toJson(map));
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    private static String randomFileNanm(String name) {
        return UUID.randomUUID().toString().replace("-", "") + name;
    }

}

相关推荐