JavaWeb图片上传服务器

准备好文件上传相应的jar包

📎commons-fileupload-1.2.1.jar

📎commons-io-1.4.jar

设计我们的图片上传页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>上传文件</title>
</head>
<body>
<!--
multipart/form-data是指表单数据有多部分构成,既有文本数据,又有文件等二进制数据的意思。
需要注意的是:默认情况下,enctype的值是application/x-www-form-urlencoded,
不能用于文件上传,只有使用了multipart/form-data,才能完整的传递文件数据。
-->
<form method="post" action="FileUploadServlet" enctype="multipart/form-data">
    图收描述:<input type="text" name="msg"><br/>
    上传图片:<input type="file" name="imgfile" id="file_input" onchange="show_image()">
    <img src="" alt="" id="show_img" width="100px" height="100px" style="display: none;" />
    <br/>
    <input type="submit" value="上传">
</form>
</body>
</html>
<script>
    function show_image() {
        //抓取到上传图片的input标签的信息
        file_input = document.getElementById("file_input");
        //抓取到需要展示预览图的img标签信息
        show_img = document.getElementById("show_img");
        //回去预览图的src属性信息
        show_img.src = window.URL.createObjectURL(file_input.files[0]);
        //改变style属性中block的值
        show_img.style.display = 'block';
    }
</script>

接收不到文本数据问题

正常情况下,我们在Servlet那儿使用 request.getParemeter();获取前端传来的文本参数,但是在使用表单提交 enctype="multipart/form-data" 模式下, 我们得不到我们想要的文本参数,接下的代码可以解决这个问题

FileUploadServlet实现上传图片的代码

package com.softeem.servlet;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.ServletContext;
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.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

@WebServlet("/FileUploadServlet")
public class FileUploadServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        //判断form表单 是否设置了 enctype="multipart/form-data"
        if(ServletFileUpload.isMultipartContent(req)){
            //创建FileItemFactory 工厂实现类
            FileItemFactory fileItemFactory = new DiskFileItemFactory();
            // 创建用于解析上传数据的工具类ServletFileUpload 类
            ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);
            try {
                // 解析上传的数据,得到每一个表单项FileItem
                List<FileItem> list = servletFileUpload.parseRequest(req);
                //循环这2段数据并处理它们
                for (FileItem fileItem : list) {
                    //判断那些是普通表单项,还是上传的文件类型
                    if(fileItem.isFormField()){
                        //处理普通表单项[文本数据]
                        //判断这个数据的名称是不是msg,如果是msg我们就对它做相应的处理
                        if("msg".equals(fileItem.getFieldName())){
                            //getString("utf-8")可以帮助我们解决中文乱码的问题
                            String msg = fileItem.getString("utf-8");
                            System.out.println("msg = " + msg);
                        }
                    }else{
                        //处理上传的图片数据
                        //getSize用来判断是不是选择了要上传的图片
                        if(fileItem.getSize() > 0){
                            String fileName = fileItem.getName();//获取文件名=
                            //获取图片的后缀名
                            int index = fileName.lastIndexOf(".");
                            //获取文件的后缀名
                            String substring = fileName.substring(index);
                            //生成新的图片名
                            String newFileName =  System.currentTimeMillis() + substring;

                            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
                            String format = simpleDateFormat.format(new Date());
                            //全局对象[上下文对象]
                            ServletContext servletContext = this.getServletContext();
                            //获取到服务器的真实路径
                            String realPath = servletContext.getRealPath("/"+format);
                            File file = new File(realPath);
                            if( !file.exists() ){
                                //如果目录不存在就创建此目录
                                file.mkdirs();
                            }
                            //上传图片
                            fileItem.write(new File(realPath, newFileName));//上传图片

                        }else{
                            System.out.println("请选择图片");
                        }
                    }
                }
            } catch (FileUploadException e) {
                throw new RuntimeException(e);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }

        }else{
            System.out.println("form提交的数据格式不正确,无法实现文件上传");
        }

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值