文件上传预习

HttpServletRequest 提供了两个方法用于从请求中解析上传的文件:

Part getPart(String name): 用于获取请求中指定name的文件
Coolection< Part > getParts();获取请求中全部的文件

每一个文件用 javax.servlet.http.Part 对象来表示,该接口提供了很多处理文件的方法

@MutipartConfig 可以设置 相应参数限制条件,必须声明,否则会报错,这里涉及到SpringMVC里的配置,先跳过。

 

package com.bluemsun.controller;



import com.bluemsun.util.JsonUtil;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

@MultipartConfig
@WebServlet("/up")
public class FileController extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Part part = request.getPart("file");
        // 获取上传的文件名扩展名
        String disposition = part.getSubmittedFileName();
        String suffix = disposition.substring(disposition.lastIndexOf("."));

        // 随机的生成uuid,作为文件名的一部分。 加上刚才获取到的后缀作为最终文件名。
        String filename = UUID.randomUUID()+suffix;
        // 获取文件上传的位置,绝对路径URL
        String serverpath = request.getServletContext().getRealPath("upload");

        System.out.println(filename);
        System.out.println(serverpath);

        //不存在文件夹则新建一个
        File fileDisk = new File(serverpath);
        if (!fileDisk.exists()){
            fileDisk.mkdir();
        }

        // 文件的真正绝对路径 = 文件存储位置 + 文件名
        String fileparts = serverpath + "/" + filename;
        // 将文件内容写入指定的磁盘位置
        part.write(fileparts);

        // 准备给前端返回的文件访问的URL
        String projectServerPath = request.getScheme()+"://"+request.getServerName()+":"
                +request.getServerPort()+request.getContextPath()+"/upload/"+filename;
        // request.getSchema()可以返回当前页面使用的协议,http 或是 https;
        // request.getServerName()可以返回当前页面所在的服务器的名字;
        // request.getServerPort()可以返回当前页面所在的服务器使用的端口,就是8080;
        // request.getContextPath()可以返回当前页面所在的应用的名字;
        // 拼接起来后就是完整的文件访问路径了!

        // 返回给前端文件访问的URL
        Map<String,String> map = new HashMap<>();
        map.put("address",projectServerPath);
        String json = JsonUtil.toJson(map);
        response.getWriter().println(json);

    }

}

文件上传时的普遍要求。

1、为保证服务器安全,一些上传的文件应该放在外界无法直接访问的目录下,比如放于WEB-INF目录下。

2、为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名。

3、为防止一个目录下面出现太多文件,可以使用hash算法打散存储。

4、要限制上传文件的最大值。

5、要限制上传文件的类型,在收到上传文件名时,判断后缀名是否合法。
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值