日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ftp的上传与单文件下载

發布時間:2024/8/1 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ftp的上传与单文件下载 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、預覽(登錄根目錄下的report下存儲)

二、代碼
ftp參數

public class TimeFTPconfig {private Integer id;private String host;private Integer port;private String user;private String pass;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getHost() {return host;}public void setHost(String host) {this.host = host;}public Integer getPort() {return port;}public void setPort(Integer port) {this.port = port;}public String getUser() {return user;}public void setUser(String user) {this.user = user;}public String getPass() {return pass;}public void setPass(String pass) {this.pass = pass;} }

上傳

public static void up(File file,String filename, TimeFTPconfig timeFTPconfig){FTPClient client = new FTPClient() ;try {client.connect(timeFTPconfig.getHost(),timeFTPconfig.getPort()) ;boolean flag = client.login(timeFTPconfig.getUser(), timeFTPconfig.getPass()) ;if(flag){client.setFileType(FTP.BINARY_FILE_TYPE);//切換工作目錄client.changeWorkingDirectory("/report") ;InputStream in = new FileInputStream(file) ;client.storeFile(filename, in) ;}} catch (SocketException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}

下載(由于這里是請求直接下載,所以返回一個輸入流,在控制層可以轉成輸出流進行寫出即可)

public static InputStream load(String urlstr, TimeFTPconfig timeFTPconfig){FTPClient client = new FTPClient() ;try {client.connect(timeFTPconfig.getHost(),timeFTPconfig.getPort()) ;boolean flag = client.login(timeFTPconfig.getUser(), timeFTPconfig.getPass()) ;if(flag){/*** ASCII傳輸方式 假定用戶正在拷貝的文件包含的簡單ASCII碼文本,* 如果在遠程機器上運行的不是UNIX,當文件傳輸時ftp通常會自動地調整文件的內容以便于把文件解釋成另外那臺計算機存儲文本文件的格式。* 但是常常有這樣的情況,用戶正在傳輸的文件包含的不是文本文件,它們可能是程序,數據庫,字處理文件或者壓縮文件,這回導致文件損壞*///設置采用二進制傳輸方式下載,若采用默認的ascii傳輸方式下載可能導致文件損失client.setFileType(FTP.BINARY_FILE_TYPE);//切換當前目錄到xxclient.changeWorkingDirectory("/report") ;InputStream inputStream=client.retrieveFileStream(urlstr);//根據指定名稱獲取指定文件return inputStream;}} catch (SocketException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}

輸入流轉輸出流 (IOUtils這個工具可以直接轉化,雙流轉化不需要File作為媒介)

org.apache.commons.io.IOUtils; 這個包下的 OutputStream os = response.getOutputStream(); IOUtils.copy(FtpClientUtil.load(urlstr,timeFTPconfig), os);

控制層下載

public void downloadFile(){//查詢出ftp的配置TimeFTPconfig timeFTPconfig = sendReportService.getFtpConfig();// 打開輸出流try {HttpServletResponse response=ServletActionContext.getResponse();// 生成返回流,設置response的類型response.setContentType("application/vnd.ms-excel");response.setHeader("Content-Disposition","attachment;filename*=utf-8'zh_cn'"+URLEncoder.encode(namestr, "UTF-8") );//response.addHeader("Content-Disposition", "attachment; filename=\"" +namestr+ "\"");OutputStream os = response.getOutputStream();IOUtils.copy(FtpClientUtil.load(urlstr,timeFTPconfig), os);// 關閉流os.flush();os.close();logger.info(SessionUtil.getFromSession(Constants.LOGIN_EMAIL)+"下載已發送附件成功");} catch (IOException e) {logger.error(SessionUtil.getFromSession(Constants.LOGIN_EMAIL)+"下載已發送附件失敗,原因為:"+e.getMessage());e.printStackTrace();}}

三、知識拓展
1、下載文件會出現中文亂碼

response.setHeader("Content-Disposition","attachment;filename*=utf-8'zh_cn'"+URLEncoder.encode(namestr, "UTF-8") );

2、獲取ftp的文件

指定文件

InputStream inputStream=client.retrieveFileStream(urlstr); //urlstr 文件名

文件列表

FTPFile[] listFiles = client.listFiles();

3、流不用關閉
OutputStream的close是空實現,不用關閉

os.close(); //空實現

四、ftp假死?
在假死的語句前面加(讀寫流、獲取文件列表前面)

FTPClient.enterLocalPassiveMode()

原因:
FTP有兩種模式:主動模式(active mode)和被動模式(passive mode)
默認情況下是啟動的主動模式。

兩種模式的詳細講解:https://blog.csdn.net/zhangyuan12805/article/details/71425385

總結

以上是生活随笔為你收集整理的ftp的上传与单文件下载的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。