java 通过浏览器提交文件到服务器

目录

前言:

所需软件与jar包:

业务流程:

前台展示:

 上传图片:

1.选择上传文件的前端代码:

2.提交给服务器:

3.前台完整代码: 

后台代码:

详细代码如下:

 代码功能解读:


前言:

在现实生活中,我们有着各种各样的需求,其中有些需求需要用户传入的特定图片,让数据库可以保存图片的信息

所需软件与jar包:

ideal tomcat 

jar包地址:文件上传jar包

 

业务流程:

从浏览器选择图片,然后通过post/get请求发送给服务器,再由服务器进行图片的操作

前台展示:

 

 上传图片:

1.选择上传文件的前端代码:

 <input type="file" name="desc"required  lay-verify="required" autocomplete="off" class="layui-input">

2.提交给服务器:

<form class="layui-form" method="post" action="/love/updateProduct.do" enctype="multipart/form-data">

注: enctype="multipart/form-data"  要加到表单里面才能上传文件

3.前台完整代码: 


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>新增</title>
    <link rel="stylesheet" href="//unpkg.com/layui@2.6.8/dist/css/layui.css">

    <!-- 引入 layui.js -->
    <script src="//unpkg.com/layui@2.6.8/dist/layui.js">
    </script>
</head>
<body>
<form class="layui-form" method="post" action="/love/insertProduct.do" enctype="multipart/form-data">
    <div class="layui-form-item">
        <label class="layui-form-label">商品编号:</label>
        <div class="layui-input-block">
            <input type="text" name="id" required lay-verify="required" autocomplete="off" class="layui-input"
                   value="${product.id}" hidden>
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">商品名称:</label>
        <div class="layui-input-block">
            <input type="text" name="name" required lay-verify="required" autocomplete="off" class="layui-input">
        </div>
    </div>

    <%--    提交图片的input--%>

    <div><label class="layui-form-label">商品图片:</label><input type="file" name="image"></div>


    <div class="layui-form-item">
        <label class="layui-form-label">商品价格:</label>
        <div class="layui-input-block">
            <input type="text" name="price" required lay-verify="required" autocomplete="off" class="layui-input">
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">所属分类:</label>
        <div class="layui-input-block">
            <select name="type" lay-verify="required">
                <option></option>
                <c:forEach var="type" items="${productTypes}">
                    <option value="${type.id}">${type.product_type_name}</option>
                </c:forEach>
            </select>
        </div>
    </div>
    <%--    商品详情图片--%>
    <div class="layui-form-item">
        <label class="layui-form-label">商品详情:</label>
        <div class="layui-input-block">
            <input type="file" name="desc" required lay-verify="required" autocomplete="off" class="layui-input">
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">商品品牌编号:</label>
        <div class="layui-input-block">
            <select name="brand" lay-verify="required">
                <option></option>
                <c:forEach var="brand" items="${brands}">
                    <option value="${brand.id}">${brand.brand_name}</option>
                </c:forEach>
            </select>
        </div>
    </div>
    <%--    提交--%>
    <div class="layui-form-item">
        <div class="layui-input-block">
            <button class="layui-btn" lay-submit lay-filter="formDemo">立即提交</button>
            <button type="reset" class="layui-btn layui-btn-primary">重置</button>
        </div>
    </div>
</form>
</body>
</html>

后台代码:

当我们将前台提供的数据传给服务器的时候,有普通的文本数据和文件数据。文件数据我们需要转换为二进制流在进行传输。首先我们就需要先判断是否是文件数据,如果不是文件数据就不用二进制化

详细代码如下:

package com.dmdd.servelt;

import com.dmdd.service.ProductServiceImpl;
import com.dmdd.utils.MD5Utils;
import org.apache.commons.fileupload.FileItemIterator;
import org.apache.commons.fileupload.FileItemStream;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.util.Streams;

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.FileOutputStream;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.UUID;

@WebServlet("/insertProduct.do")
public class InsertProductServlet extends HttpServlet {
    int x = 0;
    public static final String UPLOAD_DIR = "E:\\upload\\eshop\\";

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletFileUpload upload = new ServletFileUpload();
//设置可上传的文件大小
        if (ServletFileUpload.isMultipartContent(req)) {
            try {
                FileItemIterator itemIterator = upload.getItemIterator(req);
                String name = null, price = null, type = null, createTime = null, brand = null, image = null, desc = null, id = null;
                while (itemIterator.hasNext()) {
                    FileItemStream item = itemIterator.next();
                    if (item.isFormField()) {
                        String value = Streams.asString(item.openStream(), "UTF-8");
                        switch (item.getFieldName()) {
                            case "name":
                                name = value;
                                break;
                            case "price":
                                price = value;
                                break;
//                            case "createTime":createTime=value;
                            case "type":
                                type = value;
                                break;
                            case "brand":
                                brand = value;
                                break;
                            case "id":
                                id = value;
                                break;
                        }
                    } else {
                        //创建文件夹
                        File file = new File(UPLOAD_DIR);
                        if (!file.exists()) {
                            file.mkdir();
                        }
                        //截取后缀名
                        //获得文件名
                        String fileName = item.getName();
                        String substring = fileName.substring(fileName.lastIndexOf("."));
                        desc = UUID.randomUUID().toString().replace("-", "") + substring;
                        if (x == 0) {
                            image = desc;
                            x++;
                        }

                        Streams.copy(item.openStream(), new FileOutputStream(UPLOAD_DIR + desc), true);
                    }
                }
                //统一加密 id type brand
                id = MD5Utils.encrypt(id);
//                type = MD5Utils.encrypt(type);
//                brand = MD5Utils.encrypt(brand);
                ProductServiceImpl productService = new ProductServiceImpl();
                //获取当前时间
                LocalDateTime now = LocalDateTime.now();
                DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
                createTime = now.format(dateTimeFormatter);
                System.out.println(createTime);
                productService.executeUpdate("insert into s_product (id,product_name,product_image,price,product_type,product_desc,create_time,product_brand) values(?,?,?,?,?,?,?,?)", id, name, image, price, type, desc, createTime, brand);
                resp.sendRedirect("/love/selectProduct.do");
            } catch (FileUploadException e) {
                e.printStackTrace();
            }

        }
    }
}

 代码功能解读:

ServletFileUpload upload = new ServletFileUpload();

创建一个文件上传对象

//设置可上传的文件大小
        upload.setFileSizeMax(1024*1024*10);

ServletFileUpload.isMultipartContent(req)

判断发送的请求是否符合 就是看是否包含enctype="multipart/form-data" 

FileItemIterator itemIterator = upload.getItemIterator(req);

创建迭代器,迭代的对象为发送过来的input中的数据

itemIterator.hasNext()

开始迭代

FileItemStream item = itemIterator.next();

获取迭代对象

FileItemStream item = itemIterator.next();
item.isFormField()

判断本次迭代的对象是文件类型还是普通文本类型

item.getFieldName()

得到jsp中input 的name值

String value = Streams.asString(item.openStream(), "UTF-8");

将input框中的value值获取到。

Streams.copy(item.openStream(), new FileOutputStream(UPLOAD_DIR + desc), true);

一种io流的简写方式,就是用了特定的jar包。

以上的api是关于文件上传的api,当然后台代码中的api可不止这些。但是我就不一一讲解了,大家一定都懂。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java通过文件上传策略将视频上传到服务器需要以下几个步骤: 1. 创建一个包含文件上传表单的HTML页面 首先,我们需要创建一个包含文件上传表单的HTML页面。在HTML页面中,我们需要使用`<form>`标签来创建表单,使用`<input type="file">`标签来创建文件选择框。在表单中,我们需要指定表单的`enctype`属性为`multipart/form-data`,这样浏览器才能正确地将上传的文件发送到服务器。 2. 在服务器端处理文件上传请求 当用户提交文件上传表单时,服务器会收到一个包含上传文件的HTTP POST请求。在服务器端,我们需要解析这个请求,将上传的文件保存到服务器文件系统中。在Java中,我们可以使用Apache Commons FileUpload组件来处理文件上传请求。FileUpload组件提供了`ServletFileUpload`类,可以将HTTP POST请求解析成文件上传请求。我们可以使用`ServletFileUpload`类的`parseRequest()`方法来解析文件上传请求,然后使用`FileItem`对象提供的方法来获取文件的元数据和内容。 以下是一个简单的文件上传Servlet示例: ``` public class FileUploadServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Check that we have a file upload request boolean isMultipart = ServletFileUpload.isMultipartContent(request); if (!isMultipart) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Not a multipart request"); return; } // Create a new file upload handler ServletFileUpload upload = new ServletFileUpload(); // Parse the request try { FileItemIterator iter = upload.getItemIterator(request); while (iter.hasNext()) { FileItemStream item = iter.next(); String name = item.getFieldName(); InputStream stream = item.openStream(); if (!item.isFormField()) { // Process the file content String fileName = item.getName(); File file = new File("/path/to/upload/directory", fileName); OutputStream out = new FileOutputStream(file); IOUtils.copy(stream, out); out.close(); } } response.getWriter().println("File uploaded successfully"); } catch (Exception e) { response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Error uploading file: " + e.getMessage()); } } } ``` 在这个示例中,我们首先检查请求是否为文件上传请求,然后使用`ServletFileUpload`类的`getItemIterator()`方法解析文件上传请求。对于每个文件项,我们使用`FileItemStream`接口提供的方法来获取文件的元数据和输入流。然后,我们可以将文件保存到服务器文件系统中。 3. 给上传的文件添加安全性和可用性特性 在实际场景中,我们还需要为上传的文件添加安全性和可用性特性。例如,我们可以限制上传文件的大小、类型和数量,防止用户上传恶意文件或过多的文件占用服务器资源。我们还可以为上传的文件生成URL地址,方便用户访问和下载。 总之,Java通过文件上传策略将视频上传到服务器需要综合考虑多个因素,包括表单设计、请求解析、文件保存和安全性保障等。希望以上的示例能够对你有所帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值