文件上传(FileUpload)

文件上传

Jsp:

1.input的type属性设置为file(在layui、bootstrap等地方也可以找到更好看的控件)

2.form表单的method设置为post。(get请求会将文件名传给服务器,而不是文件本身,也就是传过去一个字符串)

3.form表单的enctype属性设置为 multipart/form-data(这种情况下将以二进制的形式传输数据)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>upload</title>
</head>
<body>
    <form method="post" enctype="multipart/form-data">
        <input type="file" name="file">
        <input type="submit" name="提交">
    </form>
</body>
</html>

Servlet:

测试文本:

Java Web,是用Java技术来解决相关web互联网领域的技术栈。
web包括:web服务端和web客户端两部分。
Java在客户端的应用有Java Applet,不过使用得很少,Java在服务器端的应用非常的丰富,比如Servlet,JSP、第三方框架等等。
Java技术对Web领域的发展注入了强大的动力。

Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。
Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。

image-20201115205556436

下面是文件上传代码:

package com.wildfire.servlet.upload;

import com.wildfire.servlet.HttpServlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;

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


    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //通过输入流获取从客户端传来的数据。

        //使读取速度加快
        //字节流
        InputStream inputStream=req.getInputStream();
        //字符流
        Reader reader=new InputStreamReader(inputStream);
        //缓冲流
        BufferedReader bufferedReader=new BufferedReader(reader);

        //通过输出流将数据输出到本地应用
        //获取文件夹的绝对路径,file是文件夹的名称,ceshifuben.txt要输出到的txt文件
        //要注意这里的file的创建位置,不能直接在IDEA里面创建,需要找到自己的工程目录,在其中的out文件夹下找到artifacts再在相应项目下创建file
        String path=req.getServletContext().getRealPath("/file/ceshifuben.txt");

        //输出流
        OutputStream outputStream=new FileOutputStream(path);
        //输出字节流
        Writer writer=new OutputStreamWriter(outputStream);
        //输出缓冲流
        BufferedWriter bufferedWriter=new BufferedWriter(writer);

        //写入
        String str="";
        //注意这里是两个括号
        while((str=bufferedReader.readLine())!=null){
            bufferedWriter.write(str);
        }

        //关闭输入输出流
        bufferedReader.close();
        bufferedWriter.close();
        writer.close();
        reader.close();
        inputStream.close();
        outputStream.close();



    }
}

要注意这里的file的创建位置,不能直接在IDEA里面创建,需要找到自己的工程目录,在其中的out文件夹下找到artifacts再在相应项目下创建file

例如我的创建位置:D:\WorkPlace\IntellijIDEAWorkPlace\IntellijIDEAJavaWebWorkPlace\javaweb学习1\out\artifacts\javaweb1_war_exploded2\file

得到的文本如下:

-----------------------------39165874219639205374108370503Content-Disposition: form-data; name="file"; filename="ceshi.txt"Content-Type: text/plainJava Web,是用Java技术来解决相关web互联网领域的技术栈。web包括:web服务端和web客户端两部分。Java在客户端的应用有Java Applet,不过使用得很少,Java在服务器端的应用非常的丰富,比如Servlet,JSP、第三方框架等等。Java技术对Web领域的发展注入了强大的动力。Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。-----------------------------39165874219639205374108370503--

image-20201115205939637

没有完成段落的划分,而且前后各多了一串字符,这是浏览器的附加信息。虽然能完成文件上传,但是效果并不是很好,所以我们大多采用以下方法:

使用FileUpload组件。

第一步:导入jar包:commons-fileupload-1.4.jar、commons-io-2.8.0.jar(使用IDEA时要注意这两个包需要同时导入)。

第二步:使用fileupload

fileupload组件可以将所有请求信息都解析成一个fileupload对象,我们可以通过对fileupload对象的操作完成上传,体现了面向对象的思想。

虽然使用字节流缓冲流读取输出速度更快,但是如果输出的文字需要换行或者是图片,就必须使用字节流,字节流能读取换行符,而且可以传输图片。

代码如下:

package com.wildfire.servlet.upload;

import com.wildfire.servlet.HttpServlet;
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 javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.List;

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

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        try {
            DiskFileItemFactory fileItemFactory=new DiskFileItemFactory();
            ServletFileUpload servletFileUpload=new ServletFileUpload(fileItemFactory);
            List<FileItem> list=servletFileUpload.parseRequest(req);
            for(FileItem fileItem:list){
                //判断是否是文件
                if(fileItem.isFormField()){
                    //不是文件,是文本框等其他控件
                    String name=fileItem.getName();
                    //设置字符集为UTF-8
                    String value=fileItem.getString("UTF-8");
                    //在控制台输出文本框的name和value值
                    System.out.println(name+":"+value);
                }else{
                    //是文件
                    String filename=fileItem.getName();
                    long size=fileItem.getSize();
                    System.out.print(filename+":"+size+":"+"Byte");
                    //读入
                    InputStream inputStream=fileItem.getInputStream();
                    /*Reader reader=new InputStreamReader(inputStream);
                    BufferedReader bufferedReader=new BufferedReader(reader);*/
                    //寻找路径,创建文件
                    String path=req.getServletContext().getRealPath("file/"+filename);
                    OutputStream outputStream=new FileOutputStream(path);
                    /*Writer writer=new OutputStreamWriter(outputStream);
                    BufferedWriter bufferedWriter=new BufferedWriter(writer);*/
                    int temp=0;
                    while((temp=inputStream.read())!=-1){
                        outputStream.write(temp);
                    }
                    /*bufferedReader.close();
                    writer.close();*/
                    outputStream.close();
                   /* bufferedWriter.close();
                    reader.close();*/
                    inputStream.close();
                    System.out.println("上传成功!");
                }
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        }
    }


}

这是使用fileupload之后得到的文件:

Java Web,是用Java技术来解决相关web互联网领域的技术栈。
web包括:web服务端和web客户端两部分。
Java在客户端的应用有Java Applet,不过使用得很少,Java在服务器端的应用非常的丰富,比如Servlet,JSP、第三方框架等等。
Java技术对Web领域的发展注入了强大的动力。

Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。
Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。

image-20201116104512893

可以很明显的看出和源文件一致。

posted @ 2020-11-16 10:51  Mr_WildFire  阅读(1468)  评论(0编辑  收藏  举报