標籤:exception name oid 讀取檔案 檔案內容 伺服器 nload 檔案名稱 檔案上傳
問題描述:將本地檔案上傳(需將檔案名稱一起上傳)至指定伺服器,伺服器將上傳的檔案儲存至指定路徑下並檔案名稱添加首碼 "Downlod_原檔案名稱"。
思路: 用戶端需要一個輸入資料流來讀取本地檔案內容和檔案名稱;需要一個輸出資料流將讀取的檔案名稱發送至伺服器端,然後再將內容發送至伺服器端。
伺服器端需要一個輸入資料流讀取檔案名稱和內容,需要一個輸出資料流將讀取到的檔案名稱添加首碼並將內容儲存至指定路徑即可;
用戶端範例程式碼:
1 package Datagram; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.OutputStream; 6 import java.net.InetSocketAddress; 7 import java.net.Socket; 8 9 /*10 * 用戶端上傳本地檔案和檔案名稱至指定伺服器上11 */12 public class FileUploadDemo {13 public static void main(String[] args) throws Exception {14 //建立用戶端通訊端對象15 Socket s = new Socket();16 //綁定發送的伺服器位址和連接埠17 InetSocketAddress isa = new InetSocketAddress("localhost", 8080);18 //發起串連19 s.connect(isa);20 //擷取輸出資料流21 OutputStream os= s.getOutputStream();22 //尋找指定檔案23 File file = new File("D:\\test.jpg");24 //擷取檔案名稱25 String fileName = file.getName();26 //建立檔案輸入資料流27 FileInputStream fis = new FileInputStream(file);28 //寫入檔案長度(方便在服務端接收是需要知道傳遞的位元組長度)29 os.write(fileName.length());30 //寫入檔案名稱31 os.write(fileName.getBytes());32 //讀取指定檔案內容33 int len = -1;34 byte[] by = new byte[1024];35 while((len=fis.read(by))!=-1){36 //將檔案內容寫入輸出資料流中37 os.write(by,0,len);38 }39 //禁掉輸出資料流40 s.shutdownOutput();41 //關流42 s.close();43 fis.close();44 os.close();45 46 }47 }
伺服器端範例程式碼:
1 package Datagram; 2 3 import java.io.FileOutputStream; 4 import java.io.InputStream; 5 import java.net.ServerSocket; 6 import java.net.Socket; 7 8 /* 9 * 伺服器端接收用戶端發送的檔案並儲存該檔案10 */11 public class FileDownloadDemo {12 public static void main(String[] args) throws Exception {13 //建立服務端通訊端對象14 ServerSocket ss = new ServerSocket(8080);15 //監聽串連並接收串連16 Socket s = ss.accept();17 //擷取輸入資料流對象18 InputStream is = s.getInputStream();19 //對檔案名稱的長度20 int fileNameLength = is.read();21 //按照讀出的檔案名稱的長度來存入位元組數組22 byte[] by = new byte[fileNameLength];23 //按傳遞的檔案名稱長度讀取一次便得到的既是檔案名稱24 is.read(by);25 26 String fileName = new String(by);27 //建立輸出資料流並更改輸出的檔案名稱28 FileOutputStream fis = new FileOutputStream("D:\\Downlod_"+fileName);29 //讀取檔案30 int len =-1;31 by = new byte[1024];32 while((len=is.read(by))!=-1){33 //將讀取到的資料寫入輸出資料流34 fis.write(by,0,len);35 }36 //禁掉輸入資料流37 s.shutdownInput();38 //關流39 fis.close();40 is.close();41 42 }43 }
檔案的上傳(TCP)