一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - java基于Apache FTP實現文件上傳、下載、修改文件名、刪除

java基于Apache FTP實現文件上傳、下載、修改文件名、刪除

2020-06-29 11:19boonya JAVA教程

本篇文章主要介紹了Apache FTP實現文件上傳、下載、修改文件名、刪除,實現了FTP文件上傳(斷點續傳)、FTP文件下載、FTP文件重命名、FTP文件刪除等功能,有需要的可以了解一下。

Apache FTP 是應用比較廣泛的FTP上傳客戶端工具,它易于操作,代碼簡略,結構清晰,是做FTP文件客戶端管理軟件的優先之選。FTP的操作包括:FTP文件上傳(斷點續傳)、FTP文件下載、FTP文件重命名、FTP文件刪除,這些操作已經將FTP應用管理的方式發揮的淋漓盡致了,So 我一直都用此種方式來實現FTP文件服務器的管理工作;下附FTP工具代碼。

1、FTP文件操作狀態枚舉類

java" id="highlighter_159133">
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.scengine.wtms.utils.ftp;
 
public enum FTPStatus
{
  File_Exits(0), Create_Directory_Success(1), Create_Directory_Fail(2), Upload_From_Break_Success(3), Upload_From_Break_Faild(4), Download_From_Break_Success(5), Download_From_Break_Faild(6), Upload_New_File_Success(7), Upload_New_File_Failed(8), Delete_Remote_Success(9), Delete_Remote_Faild(10),Remote_Bigger_Local(11),Remote_smaller_local(12),Not_Exist_File(13),Remote_Rename_Success(14),Remote_Rename_Faild(15),File_Not_Unique(16);
 
  private int status;
 
  public int getStatus()
  {
    return status;
  }
 
  public void setStatus(int status)
  {
    this.status = status;
  }
 
  FTPStatus(int status)
  {
    this.status = status;
  }
}

2、FTP文件操作工具代碼

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
package com.scengine.wtms.utils.ftp;
 
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.net.PrintCommandListener;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import com.scengine.wtms.utils.Log;
 
public class FTPUtils
{
  private FTPClient ftpClient = new FTPClient();
 
  /**
   * 對象構造 設置將過程中使用到的命令輸出到控制臺
   */
  public FTPUtils()
  {
    this.ftpClient.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out)));
  }
 
  /**
   *
   * java編程中用于連接到FTP服務器
   *
   * @param hostname
   *      主機名
   *
   * @param port
   *      端口
   *
   * @param username
   *      用戶名
   *
   * @param password
   *      密碼
   *
   * @return 是否連接成功
   *
   * @throws IOException
   */
 
  public boolean connect(String hostname, int port, String username, String password) throws IOException
  {
 
    ftpClient.connect(hostname, port);
 
    if (FTPReply.isPositiveCompletion(ftpClient.getReplyCode()))
    {
 
      if (ftpClient.login(username, password))
      {
        return true;
      }
    }
    disconnect();
    return false;
 
  }
 
  /**
   * 刪除遠程FTP文件
   *
   * @param remote
   *      遠程文件路徑
   * @return
   * @throws IOException
   */
  public FTPStatus delete(String remote) throws IOException
  {
    ftpClient.enterLocalPassiveMode();
 
    ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
 
    FTPStatus result = null;
 
    FTPFile[] files = ftpClient.listFiles(remote);
    if (files.length == 1)
    {
      boolean status = ftpClient.deleteFile(remote);
      result = status ? FTPStatus.Delete_Remote_Success : FTPStatus.Delete_Remote_Faild;
    }
    else
    {
      result = FTPStatus.Not_Exist_File;
    }
    Log.getLogger(this.getClass()).info("FTP服務器文件刪除標識:"+result);
    return result;
  }
   
  /**
   * 重命名遠程FTP文件
   *
   * @param name
   *      新遠程文件名稱(路徑-必須保證在同一路徑下)
   *      
   * @param remote
   *      遠程文件路徑
   *      
   * @return 是否成功
   *
   * @throws IOException
   */
  public FTPStatus rename(String name,String remote) throws IOException
  {
    ftpClient.enterLocalPassiveMode();
 
    ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
 
    FTPStatus result = null;
 
    FTPFile[] files = ftpClient.listFiles(remote);
    if (files.length == 1)
    {
      boolean status = ftpClient.rename(remote, name);
      result = status ? FTPStatus.Remote_Rename_Success : FTPStatus.Remote_Rename_Faild;
    }
    else
    {
      result = FTPStatus.Not_Exist_File;
    }
    Log.getLogger(this.getClass()).info("FTP服務器文件名更新標識:"+result);
    return result;
  }
   
  /**
   *
   * 從FTP服務器上下載文件
   *
   * @param fileName
   *      下載文件的名字(包括后綴名)
   *
   * @param remote
   *      遠程文件路徑
   *
   * @param local
   *      本地文件路徑
   *
   * @return 是否成功
   *
   * @throws IOException
   */
 
  public FTPStatus download(String fileName,String remote,HttpServletResponse response) throws IOException
  {
    // 開啟輸出流彈出文件保存路徑選擇窗口
    response.setContentType("application/octet-stream");
     
    response.setContentType("application/OCTET-STREAM;charset=UTF-8");
     
    response.setHeader("Content-Disposition", "attachment;filename=" +fileName);
 
    ftpClient.enterLocalPassiveMode();
 
    ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
     
    FTPStatus result;
     
    OutputStream out = response.getOutputStream();
     
    boolean status = ftpClient.retrieveFile(remote, out);
     
    result=status?FTPStatus.Download_From_Break_Success:FTPStatus.Download_From_Break_Faild;
     
    Log.getLogger(this.getClass()).info("FTP服務器文件下載標識:"+result);
     
    out.close();
     
    return result;
  }
 
  /**
   *
   * 從FTP服務器上下載文件
   *
   * @param remote
   *      遠程文件路徑
   *
   * @param local
   *      本地文件路徑
   *
   * @return 是否成功
   *
   * @throws IOException
   */
 
  @SuppressWarnings("resource")
  public FTPStatus download(String remote, String local) throws IOException
  {
 
    ftpClient.enterLocalPassiveMode();
 
    ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
 
    FTPStatus result;
 
    File f = new File(local);
 
    FTPFile[] files = ftpClient.listFiles(remote);
 
    if (files.length != 1)
    {
      Log.getLogger(this.getClass()).info("遠程文件不唯一");
      return FTPStatus.File_Not_Unique;
    }
 
    long lRemoteSize = files[0].getSize();
 
    if (f.exists())
    {
      OutputStream out = new FileOutputStream(f, true);
      Log.getLogger(this.getClass()).info("本地文件大小為:" + f.length());
 
      if (f.length() >= lRemoteSize)
      {
 
        Log.getLogger(this.getClass()).info("本地文件大小大于遠程文件大小,下載中止");
        return FTPStatus.Remote_smaller_local;
 
      }
 
      ftpClient.setRestartOffset(f.length());
 
      boolean status = ftpClient.retrieveFile(remote, out);
      result=status?FTPStatus.Download_From_Break_Success:FTPStatus.Download_From_Break_Faild;
      out.close();
 
    } else
    {
      OutputStream out = new FileOutputStream(f);
      boolean status = ftpClient.retrieveFile(remote, out);
      result=status?FTPStatus.Download_From_Break_Success:FTPStatus.Download_From_Break_Faild;
      out.close();
    }
 
    return result;
 
  }
 
  /**
   *
   * 上傳文件到FTP服務器,支持斷點續傳
   *
   * @param local
   *      本地文件名稱,絕對路徑
   *
   * @param remote
   *      遠程文件路徑,使用/home/directory1/subdirectory/file.ext
   *      按照Linux上的路徑指定方式,支持多級目錄嵌套,支持遞歸創建不存在的目錄結構
   *
   * @return 上傳結果
   *
   * @throws IOException
   */
 
  @SuppressWarnings("resource")
  public FTPStatus upload(String local, String remote) throws IOException
  {
    // 設置PassiveMode傳輸
    ftpClient.enterLocalPassiveMode();
 
    // 設置以二進制流的方式傳輸
    ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
 
    FTPStatus result;
 
    // 對遠程目錄的處理
    String remoteFileName = remote;
 
    if (remote.contains("/"))
    {
 
      remoteFileName = remote.substring(remote.lastIndexOf("/") + 1);
 
      String directory = remote.substring(0, remote.lastIndexOf("/") + 1);
 
      if (!directory.equalsIgnoreCase("/") && !ftpClient.changeWorkingDirectory(directory))
      {
 
        // 如果遠程目錄不存在,則遞歸創建遠程服務器目錄
 
        int start = 0;
 
        int end = 0;
 
        if (directory.startsWith("/"))
        {
 
          start = 1;
 
        } else
        {
 
          start = 0;
 
        }
 
        end = directory.indexOf("/", start);
 
        while (true)
        {
 
          String subDirectory = remote.substring(start, end);
 
          if (!ftpClient.changeWorkingDirectory(subDirectory))
          {
 
            if (ftpClient.makeDirectory(subDirectory))
            {
 
              ftpClient.changeWorkingDirectory(subDirectory);
 
            } else
            {
 
              Log.getLogger(this.getClass()).info("創建目錄失敗");
 
              return FTPStatus.Create_Directory_Fail;
 
            }
 
          }
 
          start = end + 1;
 
          end = directory.indexOf("/", start);
 
          // 檢查所有目錄是否創建完畢
 
          if (end <= start)
          {
 
            break;
 
          }
 
        }
 
      }
 
    }
 
    // 檢查遠程是否存在文件
 
    FTPFile[] files = ftpClient.listFiles(remoteFileName);
 
    if (files.length == 1)
    {
 
      long remoteSize = files[0].getSize();
 
      File f = new File(local);
 
      long localSize = f.length();
 
      if (remoteSize == localSize)
      {
 
        return FTPStatus.File_Exits;
 
      } else if (remoteSize > localSize)
      {
 
        return FTPStatus.Remote_Bigger_Local;
 
      }
 
      // 嘗試移動文件內讀取指針,實現斷點續傳
 
      InputStream is = new FileInputStream(f);
 
      if (is.skip(remoteSize) == remoteSize)
      {
 
        ftpClient.setRestartOffset(remoteSize);
 
        if (ftpClient.storeFile(remote, is))
        {
 
          return FTPStatus.Upload_From_Break_Success;
 
        }
 
      }
 
      // 如果斷點續傳沒有成功,則刪除服務器上文件,重新上傳
 
      if (!ftpClient.deleteFile(remoteFileName))
      {
 
        return FTPStatus.Delete_Remote_Faild;
 
      }
 
      is = new FileInputStream(f);
 
      if (ftpClient.storeFile(remote, is))
      {
 
        result = FTPStatus.Upload_New_File_Success;
 
      } else
      {
 
        result = FTPStatus.Upload_New_File_Failed;
 
      }
 
      is.close();
 
    } else
    {
 
      InputStream is = new FileInputStream(local);
 
      if (ftpClient.storeFile(remoteFileName, is))
      {
 
        result = FTPStatus.Upload_New_File_Success;
 
      } else
      {
 
        result = FTPStatus.Upload_New_File_Failed;
 
      }
 
      is.close();
    }
 
    return result;
 
  }
 
  /**
   *
   * 斷開與遠程服務器的連接
   *
   * @throws IOException
   */
 
  public void disconnect() throws IOException
  {
 
    if (ftpClient.isConnected())
    {
      ftpClient.disconnect();
    }
 
  }
 
  public static void main(String[] args)
  {
    FTPUtils myFtp = new FTPUtils();
    try
    {
 
      myFtp.connect("192.168.1.200", 21, "duser", "HTPDuserXP32");
 
      Log.getLogger(FTPUtils.class).info(myFtp.upload("C:\\Users\\Administrator\\Desktop\\swing.drawer.jar", "/jars/swing.drawer.jar"));
 
      myFtp.disconnect();
 
    } catch (IOException e)
    {
 
      Log.getLogger(FTPUtils.class).info("FTP上傳文件異常:" + e.getMessage());
 
    }
 
  }
 
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 免费网站直接进入 | 欧美成人在线影院 | 动漫jk美女被爆羞羞漫画 | 99视频久久 | 亚洲国产成人综合 | 金发美女与黑人做爰 | 好深快点再快点好爽视频 | 黄色a站| 日本免费精品 | 天堂素人在线 | 成年人福利视频 | 牛人国产偷窥女洗浴在线观看 | 色先锋av资源中文字幕 | 国产网站免费观看 | 久久精品国产视频澳门 | 青青青久在线视频免费观看 | 太粗 好紧 使劲舒服 | 草草视频在线观看 | 亚洲天堂伦理 | 91免费播放人人爽人人快乐 | 欧洲美女女同 | 波多野结衣在线看 | 男人插女人软件 | 免费一级特黄特色大片在线 | 日本色频 | 国产美女亚洲精品久久久综合91 | 无码精品一区二区三区免费视频 | 成人免费国产欧美日韩你懂的 | 午夜精品久久久久久久99蜜桃i | 欧美一级特黄特色大片免费 | 国产亚洲精品久久yy5099 | 久久机热视频 这里只有精品首页 | 久久精品久久久久 | 欧美日韩国产在线人成 | 男人视频网站 | 精品国产一二三区在线影院 | 女人特黄大aaaaaa大片 | 青草久久网 | 日本红怡院亚洲红怡院最新 | 深夜日韩 | 欧美透逼视频 |