文件上传失败记录-普通项可以上传文件却不能

(OK)访问引入了jstl页面时候报错。

1.问题介绍

        问题介绍1:已经导入了两个jar包

        问题介绍2:html表单

        问题介绍3:servlet类

        问题介绍4:页面发送下载请求

        问题介绍5:控制台打印情况

2.问题原因

        表单中文件表单项没有加name属性

3.问题解决

1.问题介绍

        问题介绍1:已经导入了两个jar包

        问题介绍2:html表单

        问题介绍3:servlet类

public class FileUpLoadServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        if (ServletFileUpload.isMultipartContent(req)){
            ServletFileUpload servletFileUpload = new ServletFileUpload(new DiskFileItemFactory());
            try {

                List<FileItem> list = servletFileUpload.parseRequest(req);
                for (FileItem fileItem  : list) {
                    if (fileItem.isFormField()){
                        System.out.println("name的值是:" + fileItem.getFieldName());
                        System.out.println("value的值是:" + fileItem.getString("UTF-8"));
                    }else {
                        System.out.println("name的值是:" + fileItem.getFieldName());
                        String fileName = "文件名是:" + fileItem.getName();
                        System.out.println(fileName);
                        File file = new File("D:\\aaa.jpg");
                        System.out.println(file.getName());
                        fileItem.write(file);
                    }
                }
            } catch (FileUploadException e) {
                throw new RuntimeException(e);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    }
}

问题介绍4:页面发送下载请求

问题介绍5:控制台打印情况

2.问题原因

        表单中文件表单项没有加name属性

3.问题解决

上传下载整个流程

上传下载共同需求:两个依赖

上传

客户端

要求

1. form表单

2. 多段式encType

3. 文件表单项传输

代码
<form action="http://localhost:8888/fileLoadServlet" method="post" enctype="multipart/form-data">
    用户名输入:<input type="text" name="username"/><br/>
    <input type="file" name="fileUpload" ><br/>
    <input type="submit" value="提交"><br/>
</form>

服务端

API

ServletFileUpload将多段数据解析成单项数据FileItem

1. ServletFileUpload:完成上传的类【解析数据】

2. FileItem:多段数据中的一段数据【处理数据】

步骤

1.【上传是多段请求】判断是不是多段请求:isMultipartContent();

2. 解析请求:parseRequest();

        new ServletFileUpload(new DiskFileItemFactory()).parseRequest(req);

        【需要一个处理数据工厂DiskFileItemFactory】

3. 遍历多段数据,判断是不是普通项:isFormField()

4. 是普通项

        FileItem.getFieldName();【获取name属性值】

        FileItem.getString("UTF-8");【获取value属性值】

5. 是文件

        FileItem.getFieldName();【获取name属性值】

        FileItem.getName();【获取文件名】

        最后一步:FileItem.write(file);【写到文件中,上传完成】

下载

客户端

发送请求就行,不许要其他操作。

服务端

两步做到下载

1. 显示到页面

2. 通知客户端下载

显示到页面

1. 从文件中获取文件流:【任何字节输入流都可以】

getServletContext().getResourceAsStream("/file/" + fileName);

2. 获取响应输出流:resp.getOutputStream();

3. 输出给客户端

IOUtils.copy(resourceAsStream,outputStream);

这一步做到了两件事:将输入流复制到输出流,将输出流响应给客户端

通知客户端下载

设置文件处理响应头:Content-Disposition

值设置成附件处理:attachment;filename=【自定义文件名】

resp.setHeader("Content-Disposition","attachment;filename="+fileName);

设置响应头 必须在 获取响应输出流 之前

--------------------------------------------------------------------------------------

最后声明:获取到的value值可能乱码,getString("【设置字符集】");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值