java 实现FTP下载文件。支持断点下载
2016-05-06 16:48
513 查看
使用java 实现一个简单的FTP文件下载案例。
maven 依赖
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-ftp</artifactId>
<version>2.13.2</version>
</dependency>
----------------------------------------------------------------------------------------
public void throwApkStream(HttpServletResponse response,
HttpServletRequest request, @RequestParam String apkName) {
String url = GetConfigProject.getProperty("APKURL");服务器地址
String username = GetConfigProject.getProperty("APKUID");FTP账号
String password = GetConfigProject.getProperty("APKPWD");FTP密码
String remotePath = GetConfigProject.getProperty("APKPATH");FTP文件夹路径
apkName = apkName + ".apk";
FTPClient ftp = new FTPClient();
try {
ftp.connect(url, 21);
ftp.setControlEncoding("GB2312");
FTPClientConfig conf = new FTPClientConfig("WINDOWS");
conf.setServerLanguageCode("zh");
ftp.login(username, password);
ftp.setFileType(2);
ftp.enterLocalPassiveMode();
int reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return;
}
ftp.changeWorkingDirectory(remotePath);
FTPFile[] fs = ftp.listFiles();
for (int i = 0; i < fs.length; i++) {
FTPFile ff = fs[i];
if (!ff.getName().equals(apkName))
continue;
String filename = apkName;
response.setHeader(
"Content-disposition",
"attachment;filename="
+ URLEncoder.encode(filename, "utf-8"));
InputStream is = ftp.retrieveFileStream(filename);
response.setHeader("Accept-Ranges", "bytes");
long p = 0L;
long l = 0L;
l = ff.getSize();
if (request.getHeader("Range") != null) {
response.setStatus(206);
p = Long.parseLong(request.getHeader("Range")
.replaceAll("bytes=", "").replaceAll("-", ""));
}
response.setHeader("Content-Length", new Long(l - p).toString());
if (p != 0L) {
response.setHeader("Content-Range",
"bytes " + new Long(p).toString() + "-"
+ new Long(l - 1L).toString() + "/"
+ new Long(l).toString());
}
response.setContentType("application/octet-stream");
response.setHeader("content-disposition",
"attachment;filename=" + apkName);
is.skip(p);
byte[] buffer = new byte[1024];
OutputStream os = response.getOutputStream();
int len;
while ((len = is.read(buffer)) != -1) {
os.write(buffer, 0, len);
}
is.close();
os.flush();
os.close();
}
ftp.logout();
} catch (IOException e) {
e.printStackTrace();
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException localIOException2) {
}
}
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException localIOException3) {
}
}
}
}
maven 依赖
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-ftp</artifactId>
<version>2.13.2</version>
</dependency>
----------------------------------------------------------------------------------------
public void throwApkStream(HttpServletResponse response,
HttpServletRequest request, @RequestParam String apkName) {
String url = GetConfigProject.getProperty("APKURL");服务器地址
String username = GetConfigProject.getProperty("APKUID");FTP账号
String password = GetConfigProject.getProperty("APKPWD");FTP密码
String remotePath = GetConfigProject.getProperty("APKPATH");FTP文件夹路径
apkName = apkName + ".apk";
FTPClient ftp = new FTPClient();
try {
ftp.connect(url, 21);
ftp.setControlEncoding("GB2312");
FTPClientConfig conf = new FTPClientConfig("WINDOWS");
conf.setServerLanguageCode("zh");
ftp.login(username, password);
ftp.setFileType(2);
ftp.enterLocalPassiveMode();
int reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return;
}
ftp.changeWorkingDirectory(remotePath);
FTPFile[] fs = ftp.listFiles();
for (int i = 0; i < fs.length; i++) {
FTPFile ff = fs[i];
if (!ff.getName().equals(apkName))
continue;
String filename = apkName;
response.setHeader(
"Content-disposition",
"attachment;filename="
+ URLEncoder.encode(filename, "utf-8"));
InputStream is = ftp.retrieveFileStream(filename);
response.setHeader("Accept-Ranges", "bytes");
long p = 0L;
long l = 0L;
l = ff.getSize();
if (request.getHeader("Range") != null) {
response.setStatus(206);
p = Long.parseLong(request.getHeader("Range")
.replaceAll("bytes=", "").replaceAll("-", ""));
}
response.setHeader("Content-Length", new Long(l - p).toString());
if (p != 0L) {
response.setHeader("Content-Range",
"bytes " + new Long(p).toString() + "-"
+ new Long(l - 1L).toString() + "/"
+ new Long(l).toString());
}
response.setContentType("application/octet-stream");
response.setHeader("content-disposition",
"attachment;filename=" + apkName);
is.skip(p);
byte[] buffer = new byte[1024];
OutputStream os = response.getOutputStream();
int len;
while ((len = is.read(buffer)) != -1) {
os.write(buffer, 0, len);
}
is.close();
os.flush();
os.close();
}
ftp.logout();
} catch (IOException e) {
e.printStackTrace();
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException localIOException2) {
}
}
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException localIOException3) {
}
}
}
}
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树