1. 程式人生 > 實用技巧 >檔案上傳(FileUpload)

檔案上傳(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語言作為靜態面向物件程式語言的代表,極好地實現了面向物件理論,允許程式設計師以優雅的思維方式進行復雜的程式設計。

下面是檔案上傳程式碼:

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--

沒有完成段落的劃分,而且前後各多了一串字元,這是瀏覽器的附加資訊。雖然能完成檔案上傳,但是效果並不是很好,所以我們大多采用以下方法:

使用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語言作為靜態面向物件程式語言的代表,極好地實現了面向物件理論,允許程式設計師以優雅的思維方式進行復雜的程式設計。

可以很明顯的看出和原始檔一致。