文件上傳下載案例

一、文件上傳分析圖解

(1)【客戶端】輸入流,從硬盤讀取文件數據到程序中。
(2)【客戶端】輸出流,寫出文件數據到服務端。
(3)【服務端】輸入流,讀取文件數據到服務端程序。
(4)【服務端】輸出流,寫出文件數據到服務器硬盤中。
在這裏插入圖片描述

二、客戶端實現

文件上傳案例的客戶端:讀取本地文件,上傳到服務器,讀取服務器回寫的數據

明確:
 	數據源存在 c:\\1.jpg
    目的地:服務器

實現步驟:1)創建一個本地字節輸入流FileInputStream對象,構造方法中綁定要讀取的數據源
    (2)創建一個客戶端Socket對象,構造方法中綁定服務器的IP地址和端口號
    (3)使用Socket中的方法getOutputStream,獲取網絡字節輸出流OutputStream對象
    (4)使用本地字節輸入流FileInputStream對象中的方法read,讀取本地文件
    (5)使用網絡字節輸出流OutputStream對象中的方法write,把讀取到的文件上傳到服務器
    (6)使用Socket中的方法getInputStream,獲取網絡字節輸入流InputStream對象
    (7)使用網絡字節輸入流InputStream對象中的方法read讀取服務回寫的數據
    (8)釋放資源(FileInputStream,Socket)
public class FileUpload_Client {
    public static void main(String[] args) throws IOException {
        //1.創建一個本地字節輸入流FileInputStream對象,構造方法中綁定要讀取的數據源
        FileInputStream fis = new FileInputStream("D:\\1.jpg");
        //2.創建一個客戶端Socket對象,構造方法中綁定服務器的IP地址和端口號
        Socket socket = new Socket("127.0.0.1",8888);
        //3.使用Socket中的方法getOutputStream,獲取網絡字節輸出流OutputStream對象
        OutputStream os = socket.getOutputStream();
        //4.使用本地字節輸入流FileInputStream對象中的方法read,讀取本地文件
        int len = 0;
        byte[] bytes = new byte[1024];
        while((len = fis.read(bytes))!=-1){
            //5.使用網絡字節輸出流OutputStream對象中的方法write,把讀取到的文件上傳到服務器
            os.write(bytes,0,len);
        }

        //6.使用Socket中的方法getInputStream,獲取網絡字節輸入流InputStream對象
        InputStream is = socket.getInputStream();

        //7.使用網絡字節輸入流InputStream對象中的方法read讀取服務回寫的數據
        while((len = is.read(bytes))!=-1){
            System.out.println(new String(bytes,0,len));
        }
        //8.釋放資源(FileInputStream,Socket)
        fis.close();
        socket.close();
    }
}

三、服務端實現

文件上傳案例服務器端:讀取客戶端上傳的文件,保存到服務器的硬盤,給客戶端回寫"上傳成功"

明確:
        數據源:客戶端上傳的文件
        目的地:服務器的硬盤 d:\\upload\\1.jpg

實現步驟:1)創建一個服務器ServerSocket對象,和系統要指定的端口號
       (2)使用ServerSocket對象中的方法accept,獲取到請求的客戶端Socket對象
       (3)使用Socket對象中的方法getInputStream,獲取到網絡字節輸入流InputStream對象
       (4)判斷d:\\upload文件夾是否存在,不存在則創建
       (5)創建一個本地字節輸出流FileOutputStream對象,構造方法中綁定要輸出的目的地
       (6)使用網絡字節輸入流InputStream對象中的方法read,讀取客戶端上傳的文件
       (7)使用本地字節輸出流FileOutputStream對象中的方法write,把讀取到的文件保存到服務器的硬盤上
       (8)使用Socket對象中的方法getOutputStream,獲取到網絡字節輸出流OutputStream對象
       (9)使用網絡字節輸出流OutputStream對象中的方法write,給客戶端回寫"上傳成功"10)釋放資源(FileOutputStream,Socket,ServerSocket)
public class FileUpload_Server {
    public static void main(String[] args) throws IOException {
        //1.創建一個服務器ServerSocket對象,和系統要指定的端口號
        ServerSocket server = new ServerSocket(8888);
        //2.使用ServerSocket對象中的方法accept,獲取到請求的客戶端Socket對象
        Socket socket = server.accept();
        //3.使用Socket對象中的方法getInputStream,獲取到網絡字節輸入流InputStream對象
        InputStream is = socket.getInputStream();
        //4.判斷d:\\upload文件夾是否存在,不存在則創建
        File file =  new File("d:\\upload");
        if(!file.exists()){
            file.mkdirs();
        }
        //5.創建一個本地字節輸出流FileOutputStream對象,構造方法中綁定要輸出的目的地
        FileOutputStream fos = new FileOutputStream(file+"\\1.jpg");
        //6.使用網絡字節輸入流InputStream對象中的方法read,讀取客戶端上傳的文件
        int len =0;
        byte[] bytes = new byte[1024];
        while((len = is.read(bytes))!=-1){
            //7.使用本地字節輸出流FileOutputStream對象中的方法write,把讀取到的文件保存到服務器的硬盤上
            fos.write(bytes,0,len);
        }

        //8.使用Socket對象中的方法getOutputStream,獲取到網絡字節輸出流OutputStream對象
        //9.使用網絡字節輸出流OutputStream對象中的方法write,給客戶端回寫"上傳成功"
        socket.getOutputStream().write("上傳成功".getBytes());
        //10.釋放資源(FileOutputStream,Socket,ServerSocket)
        fos.close();
        socket.close();
        server.close();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章