-
ftp 下载文件
2012-12-24 16:49:191.从ftp下载文件到D:/ftpDownLoad 2.读取文件写入数据库,然后转移写入后的文件到E:/localhostDowload 3..定时器(spring 的Quartz)定时作业 这里引入的jar包是commons-net-1.4.1.jar 及 jakarta-oro-2.0.8....功能描述:定时从ftp上下载文件到本地,读取文件中的电话号码,添加到数据库中。
1.从ftp下载文件到D:/ftpDownLoad
2.读取文件写入数据库,然后转移写入后的文件到E:/localhostDowload
3..定时器(spring 的Quartz)定时作业
这里引入的jar包是commons-net-1.4.1.jar 及 jakarta-oro-2.0.8.jar;
因为涉及到大量数据文件的下载和io操作及入库 只是单一的这么写下载就够呛入库操作更是显得坑爹异常。所以还得另想办法。
在这儿目前想到的解决方案先记下来:
因为下载的文件可能很多虽然每个文件的数据量不是很多也就不到700kb也就是6.5万条记录差不多的样子。但是动辄几十上百甚至更多的文件,入库的时候自是不必说的,光下载也是很吃力的。所以只能考虑用多线程来解决一下。不过之前没怎么弄过线程这块儿的,这次就当是练练刀 呵呵。。。
首先如开头所述,这是个基于ssh的项目。下载及入库操作又都是以定时作业的方式来实现。那么就在原有的框架基础上加一个任务的,我且称之为quartz层。那么整个流程就变成 这样了:
quartz-->传入service 与文件路径-->启用多线程(这边写一个线程类)-->调用service-->调用Dao进行入库操作
首先因为用的是ssh定时任务我选择用sping 的定时任务
jobClass的代码如下
package com.soarsky.service.quartz;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPClientConfig;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.log4j.Logger;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;import com.soarsky.common.util.DownloadFromFtpThread;
import com.soarsky.common.util.GetConfig;
import com.soarsky.service.IDownLoadFileFromFtpService;/**
* 定时从ftp下载文件
* @author JohnYang
*
*/
public class FtpDownLoadQuartz implements Job {
private static Logger logger = Logger.getLogger(FtpDownLoadQuartz.class);private IDownLoadFileFromFtpService downLoadFileFromFtpService;
private String fileName;public String getFileName() {
return fileName;
}public void setFileName(String fileName) {
this.fileName = fileName;
}public IDownLoadFileFromFtpService getDownLoadFileFromFtpService() {
return downLoadFileFromFtpService;
}public void setDownLoadFileFromFtpService(
IDownLoadFileFromFtpService downLoadFileFromFtpService) {
this.downLoadFileFromFtpService = downLoadFileFromFtpService;
}public FtpDownLoadQuartz(
IDownLoadFileFromFtpService downLoadFileFromFtpService,
String fileName) {
this.downLoadFileFromFtpService = downLoadFileFromFtpService;
this.fileName = fileName;
}public FtpDownLoadQuartz() {
}@Override
public void execute(JobExecutionContext context)
throws JobExecutionException {
try {
// 获取map
JobDataMap dataMap = context.getJobDetail().getJobDataMap();
// 获取map中的service
downLoadFileFromFtpService = (IDownLoadFileFromFtpService) dataMap
.get("downLoadFileFromFtpService");
FTPClient ftp = new FTPClient();
// 获取配置信息
String url = GetConfig.getInstance().getValue("ftp.Ip");
Integer port = Integer.valueOf(GetConfig.getInstance().getValue(
"ftp.port"));
String username = GetConfig.getInstance().getValue("ftp.userName");
String password = GetConfig.getInstance().getValue("ftp.password");
String ftpDir = GetConfig.getInstance().getValue("ftp.ftpDir");int reply;
ftp.connect(url, port);
ftp.setControlEncoding("UTF-8");
FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT);
conf.setServerLanguageCode("zh");// 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
ftp.login(username, password);// 登录
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
logger.info("登录失败!");
}
logger.info("登录成功!");
ftp.changeWorkingDirectory(ftpDir);// 转移到FTP服务器目录
logger.info("ftp.getRemoteAddress:" + ftp.getRemoteAddress());
//获得相应目录下要下载的文件列表
FTPFile[] fs = ftp.listFiles();
//实例化下载文件线程对象
DownloadFromFtpThread th = null;
for (int k = 0; k < fs.length; k++) {
//获得要下载文件名
fileName = fs[k].getName();
th = new DownloadFromFtpThread(downLoadFileFromFtpService,fileName);
new Thread(th).start();
}
} catch (Exception e) {
logger.error("quartz error......");
e.printStackTrace();
}
logger.info("quartz end......");
}}
package com.soarsky.service.quartz;
import java.io.File;
import org.apache.log4j.Logger;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;import com.soarsky.common.util.GetConfig;
import com.soarsky.common.util.ReadFromLoaclThread;
import com.soarsky.service.IDownLoadFileFromFtpService;/**
* 转移下载下来的文件并且入库
* @author Johnyang
*
*/
public class GetDownLoadDateQuartz implements Job {
private static Logger log = Logger.getLogger(GetDownLoadDateQuartz.class);private IDownLoadFileFromFtpService downLoadFileFromFtpService;
private String fileName;
public String getFileName() {
return fileName;
}public void setFileName(String fileName) {
this.fileName = fileName;
}
public IDownLoadFileFromFtpService getDownLoadFileFromFtpService() {
return downLoadFileFromFtpService;
}public void setDownLoadFileFromFtpService(
IDownLoadFileFromFtpService downLoadFileFromFtpService) {
this.downLoadFileFromFtpService = downLoadFileFromFtpService;
}
public GetDownLoadDateQuartz(IDownLoadFileFromFtpService downLoadFileFromFtpService,String fileName) {
this.downLoadFileFromFtpService = downLoadFileFromFtpService;
this.fileName = fileName;
}
public GetDownLoadDateQuartz() {
}
@Override
public void execute(JobExecutionContext context)
throws JobExecutionException {try {
// 获取map
JobDataMap dataMap = context.getJobDetail().getJobDataMap();
// // 获取map中的service
downLoadFileFromFtpService = (IDownLoadFileFromFtpService) dataMap.get("downLoadFileFromFtpService");
// //读取下载文件并入库
String SourcePath = GetConfig.getInstance().getValue("ftp.sourceDir");
File file = new File(SourcePath);
String[] nameList = file.list();
if (nameList.length > 0) {
for (int i = 0; i < nameList.length; i++) {
fileName=nameList[i];
ReadFromLoaclThread th = new ReadFromLoaclThread(downLoadFileFromFtpService, fileName);
new Thread(th).start();
}
}
} catch (Exception e) {
log.error("quartz error......");
e.printStackTrace();
}
log.info("quartz end......");
}
}spring bean.xm.中配置如下:
<!-- quartz配置 -->
<!-- 从ftp 下载文件 -->
<bean name="FtpDownTask" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass"
value="com.soarsky.service.quartz.FtpDownLoadQuartz" /> <!-- 指定ftp 下载文件job -->
<property name="jobDataAsMap">
<map>
<entry key="downLoadFileFromFtpService" value-ref="downLoadFileFromFtpService" />
</map>
</property>
</bean><bean id="downLoadTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="FtpDownTask" />
</property>
<property name="cronExpression">
<!--两分钟执行一次<value>0 0/2 * * * ?</value>-->
<!--每天9点执行 -->
<value>0 0 9 * * ?</value>
</property>
</bean><!-- 读取本地的下载文件 并加入数据库 -->
<bean name="getDownLoadDateTask" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass"
value="com.soarsky.service.quartz.GetDownLoadDateQuartz" /><!-- 指定定时任务的job -->
<property name="jobDataAsMap">
<map>
<entry key="downLoadFileFromFtpService" value-ref="downLoadFileFromFtpService" />
</map>
</property>
</bean><bean id="getDownLoadDateTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="getDownLoadDateTask" />
</property>
<property name="cronExpression">
<value>0 0 10 * * ?</value>
</property>
</bean><!--启用定时任务 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref local="cronTrigger" />
<ref local="downLoadTrigger"/>
<ref local="getDownLoadDateTrigger"/>
</list>
</property>
<property name="startupDelay" value="60"></property>
</bean>package com.soarsky.common.util;
import com.soarsky.service.IDownLoadFileFromFtpService;
/**
* 多线程下载Ftp上的文件
* @author JohnYang
*
*/public class DownloadFromFtpThread implements Runnable {
private IDownLoadFileFromFtpService downLoadFileFromFtpService;
private String fileName;public String getFileName() {
return fileName;
}public void setFileName(String fileName) {
this.fileName = fileName;
}public DownloadFromFtpThread(
IDownLoadFileFromFtpService downLoadFileFromFtpService,
String fileName) {
this.downLoadFileFromFtpService = downLoadFileFromFtpService;
this.fileName = fileName;
}public DownloadFromFtpThread() {
//注:如果为线程类声明了其他的构造函数,那也要把它的无参构造函数显示写出不然会报异常 (这个有时间再做研究)
}/**
*
*/
public synchronized void run() {try {
downLoadFileFromFtpService.downFile(fileName);
} catch (Exception e1) {
e1.printStackTrace();
}
}public IDownLoadFileFromFtpService getDownLoadFileFromFtpService() {
return downLoadFileFromFtpService;
}public void setDownLoadFileFromFtpService(
IDownLoadFileFromFtpService downLoadFileFromFtpService) {
this.downLoadFileFromFtpService = downLoadFileFromFtpService;
}}
最后serviceImpl实现就可以了
/**
* Description: 从FTP服务器下载文件
*
* @param url
* FTP服务器hostname
* @param port
* FTP服务器端口
* @param username
* FTP登录账号
* @param password
* FTP登录密码
* @param remotePath
* FTP服务器上的相对路径
* @param localPath
* 下载后保存到本地的路径
* @return
*/
public void downFile(String fileName) {
OutputStream output = null;
FTPClient ftp = new FTPClient();
//获取配置信息
String url = GetConfig.getInstance().getValue("ftp.Ip");
Integer port = Integer.valueOf(GetConfig.getInstance().getValue("ftp.port"));
String username = GetConfig.getInstance().getValue("ftp.userName");
String password = GetConfig.getInstance().getValue("ftp.password");
String ftpDir = GetConfig.getInstance().getValue("ftp.ftpDir");
String sourceDir = GetConfig.getInstance().getValue("ftp.sourceDir");
try {
int reply;
ftp.connect(url, port);
ftp.setControlEncoding("UTF-8");
FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT);
conf.setServerLanguageCode("zh");
// // 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
ftp.login(username, password);// 登录
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
logger.info("登录失败!");
}
logger.info("登录成功!");
ftp.changeWorkingDirectory(ftpDir);// 转移到FTP服务器目录
output = new FileOutputStream(new File(sourceDir + "/" + fileName));
ftp.retrieveFile(new String(fileName.getBytes("UTF-8"),"ISO-8859-1"), output);
output.flush();
output.close();
} catch (IOException e) {
logger.error("下载文件失败!");
this.downFile(fileName);
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.logout();
ftp.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
logger.info("操作结束!");
}
}/**
* 遍历ftp上所有要下载的txt文件 并录入数据库
*/
public void saveUsersByDownload(String fileName) {
// 读取到的数据录入数据库
String SourcePath = GetConfig.getInstance().getValue("ftp.sourceDir");
String toPath = GetConfig.getInstance().getValue("ftp.toDir");
File newFile = new File(toPath);
//临时文件
File fs =new File(SourcePath + fileName);
BufferedReader br = null;
String str = null;
try {
br = new BufferedReader(new InputStreamReader(new FileInputStream(fs)));
// 添加群组信息到用户群组信息表
UserGroup oldUserGroup = userGroupDAO.queryByGroupName(fileName
.substring(0, fileName.length() - 4));
UserGroup userGroup = new UserGroup();
if (oldUserGroup == null) {
userGroup.setGroupName(fileName.substring(0,
fileName.length() - 4));
userGroup.setGroupType(1);
userGroup.setAddTime(DateUtil.getCursorDate());
userGroupDAO.saveUserGroup(userGroup);
} else {
userGroup = oldUserGroup;
}
while ((str = br.readLine()) != null) {
// 添加群组数据到用户信息表
if (str.matches("^[1][3-8]\\d{9}$")) {
Userinfo oldUserinfo = userinfoDAO.queryByPhone(str);
Userinfo userinfo = new Userinfo();
if (oldUserinfo == null) {
userinfo.setAddTime(DateUtil.getCursorDate());
userinfo.setPhone(str);
userinfoDAO.saveUserinfo(userinfo);
} else {
userinfo = oldUserinfo;
}
// 更新用户群组关系表
UserUsergroup userUsergroup = new UserUsergroup();
userUsergroup.setUserId(userinfo.getId());
userUsergroup.setUserGroupId(userGroup.getId());
userUsergroupDAO.saveUserUsergroup(userUsergroup);
}
}
} catch (Exception e) {
e.printStackTrace();
}
if (!newFile.exists()) {
newFile.mkdir();
}
// 将文件移到新文件里
removeFile(SourcePath + fileName, toPath + fileName);
// 删除源文件
// fs.delete();
}至此 算是告一段落,运行起来速度是快了测试的时候数据量正常下载还好,入库的速度仍然不理想。因为是初次写着个所以有点儿乱。下载那块儿怎么看怎么别扭,没办法时间仓促, 有时间我会继续整理,并找找到一个好点儿的解决方案来。
-
php curl ftp 下载文件
2017-05-16 12:17:39php curl ftp 下载文件不知道为什么用正常的ftp_get函数下载文件速度特别慢,但是用ftp的客户端下载很快,所以换了curl的下载方式,速度正常function file_upload($ftpIp,$ftpUser,$ftpPwd,$path,$fileSavePath){ ...php curl ftp 下载文件
不知道为什么用正常的ftp_get函数下载文件速度特别慢,但是用ftp的客户端下载很快,所以换了curl的下载方式,速度正常
function file_upload($ftpIp,$ftpUser,$ftpPwd,$path,$fileSavePath){ $curlobj = curl_init();//初始化 //传入ftp的目标文件,如'ftp://192.168.3.1/test/1.jpg' curl_setopt($curlobj,CURLOPT_URL,"ftp://".$ftpIp."/".$path); curl_setopt($curlobj,CURLOPT_HEADER,0);//不输出header curl_setopt($curlobj,CURLOPT_RETURNTRANSFER,0); //time out after 300s curl_setopt($curlobj,CURLOPT_TIMEOUT,2000);//超时时间 //通过这个函数设置ftp的用户名和密码,没设置就不需要! curl_setopt($curlobj,CURLOPT_USERPWD,$ftpUser.':'.$ftpPwd); $outfile = fopen($fileSavePath,'w+'); //保存到本地文件的文件名 curl_setopt($curlobj,CURLOPT_FILE,$outfile); $rtn = curl_exec($curlobj); if(curl_errno($curlobj)){ writeLog('Curl error: ' . curl_error($curlobj)); } fclose($outfile); curl_close($curlobj); if($rtn == 1){ return true; }else{ unlink($fileSavePath);//如果下载失败,但是本地open了这个文件,所以要删除 return false; } }
测试下载小文件是正常的,但是如果网速很慢,下载大文件时候,会报一个ftp timeout的错误,目前还在不知道是哪里配置问题,还是什么问题。
-
c#通过ftp下载文件
2017-12-21 15:07:28c#通过ftp下载文件,借用了两位大神的代码 http://www.cnblogs.com/rond/archive/2012/07/30/2611295.html http://blog.csdn.net/csethcrm/article/details/8139744 感谢 在这做下记录 using System; ...c#通过ftp下载文件,借用了两位大神的代码
http://www.cnblogs.com/rond/archive/2012/07/30/2611295.htmlhttp://blog.csdn.net/csethcrm/article/details/8139744
感谢
在这做下记录using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; //ftp类 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.IO; using System.Threading; using FtpSyn; namespace FtpSyn { public class FtpHelper { //基本设置 static private string path = @"ftp://" + "192.168.1.103" + "/"; //目标路径 static private string ftpip = "192.168.1.103"; //ftp IP地址 static private string username = "root"; //ftp用户名 static private string password = ""; //ftp密码 //获取ftp上面的文件和文件夹 public static string[] GetFileList(string dir) { string[] downloadFiles; StringBuilder result = new StringBuilder(); FtpWebRequest request; try { request = (FtpWebRequest)FtpWebRequest.Create(new Uri(path)); request.UseBinary = true; request.Credentials = new NetworkCredential(username, password);//设置用户名和密码 request.Method = WebRequestMethods.Ftp.ListDirectory; request.UseBinary = true; WebResponse response = request.GetResponse(); StreamReader reader = new StreamReader(response.GetResponseStream()); string line = reader.ReadLine(); while (line != null) { result.Append(line); result.Append("\n"); Console.WriteLine(line); line = reader.ReadLine(); } // to remove the trailing '\n' result.Remove(result.ToString().LastIndexOf('\n'), 1); reader.Close(); response.Close(); return result.ToString().Split('\n'); } catch (Exception ex) { Console.WriteLine("获取ftp上面的文件和文件夹:" + ex.Message); downloadFiles = null; return downloadFiles; } } /// <summary> /// 获取文件大小 /// </summary> /// <param name="file">ip服务器下的相对路径</param> /// <returns>文件大小</returns> public static int GetFileSize(string file) { StringBuilder result = new StringBuilder(); FtpWebRequest request; try { request = (FtpWebRequest)FtpWebRequest.Create(new Uri(path + file)); request.UseBinary = true; request.Credentials = new NetworkCredential(username, password);//设置用户名和密码 request.Method = WebRequestMethods.Ftp.GetFileSize; int dataLength = (int)request.GetResponse().ContentLength; return dataLength; } catch (Exception ex) { Console.WriteLine("获取文件大小出错:" + ex.Message); return -1; } } /// <summary> /// 文件上传 /// </summary> /// <param name="filePath">原路径(绝对路径)包括文件名</param> /// <param name="objPath">目标文件夹:服务器下的相对路径 不填为根目录</param> public static void FileUpLoad(string filePath, string objPath = "") { try { string url = path; if (objPath != "") url += objPath + "/"; try { FtpWebRequest reqFTP = null; //待上传的文件 (全路径) try { FileInfo fileInfo = new FileInfo(filePath); using (FileStream fs = fileInfo.OpenRead()) { long length = fs.Length; reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(url + fileInfo.Name)); //设置连接到FTP的帐号密码 reqFTP.Credentials = new NetworkCredential(username, password); //设置请求完成后是否保持连接 reqFTP.KeepAlive = false; //指定执行命令 reqFTP.Method = WebRequestMethods.Ftp.UploadFile; //指定数据传输类型 reqFTP.UseBinary = true; using (Stream stream = reqFTP.GetRequestStream()) { //设置缓冲大小 int BufferLength = 5120; byte[] b = new byte[BufferLength]; int i; while ((i = fs.Read(b, 0, BufferLength)) > 0) { stream.Write(b, 0, i); } Console.WriteLine("上传文件成功"); } } } catch (Exception ex) { Console.WriteLine("上传文件失败错误为" + ex.Message); } finally { } } catch (Exception ex) { Console.WriteLine("上传文件失败错误为" + ex.Message); } finally { } } catch (Exception ex) { Console.WriteLine("上传文件失败错误为" + ex.Message); } } /// <summary> /// 删除文件 /// </summary> /// <param name="fileName">服务器下的相对路径 包括文件名</param> public static void DeleteFileName(string fileName) { try { FileInfo fileInf = new FileInfo(ftpip + "" + fileName); string uri = path + fileName; FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri)); // 指定数据传输类型 reqFTP.UseBinary = true; // ftp用户名和密码 reqFTP.Credentials = new NetworkCredential(username, password); // 默认为true,连接不会被关闭 // 在一个命令之后被执行 reqFTP.KeepAlive = false; // 指定执行什么命令 reqFTP.Method = WebRequestMethods.Ftp.DeleteFile; FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse(); response.Close(); } catch (Exception ex) { Console.WriteLine("删除文件出错:" + ex.Message); } } /// <summary> /// 新建目录 上一级必须先存在 /// </summary> /// <param name="dirName">服务器下的相对路径</param> public static void MakeDir(string dirName) { try { string uri = path + dirName; FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri)); // 指定数据传输类型 reqFTP.UseBinary = true; // ftp用户名和密码 reqFTP.Credentials = new NetworkCredential(username, password); reqFTP.Method = WebRequestMethods.Ftp.MakeDirectory; FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse(); response.Close(); } catch (Exception ex) { Console.WriteLine("创建目录出错:" + ex.Message); } } /// <summary> /// 删除目录 上一级必须先存在 /// </summary> /// <param name="dirName">服务器下的相对路径</param> public static void DelDir(string dirName) { try { string uri = path + dirName; FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri)); // ftp用户名和密码 reqFTP.Credentials = new NetworkCredential(username, password); reqFTP.Method = WebRequestMethods.Ftp.RemoveDirectory; FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse(); response.Close(); } catch (Exception ex) { Console.WriteLine("删除目录出错:" + ex.Message); } } /// <summary> /// 从ftp服务器上获得文件夹列表 /// </summary> /// <param name="RequedstPath">服务器下的相对路径</param> /// <returns></returns> public static List<string> GetDirctory(string RequedstPath) { List<string> strs = new List<string>(); try { string uri = path + RequedstPath; //目标路径 path为服务器地址 FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri)); // ftp用户名和密码 reqFTP.Credentials = new NetworkCredential(username, password); reqFTP.Method = WebRequestMethods.Ftp.ListDirectoryDetails; WebResponse response = reqFTP.GetResponse(); StreamReader reader = new StreamReader(response.GetResponseStream());//中文文件名 string line = reader.ReadLine(); while (line != null) { if (line.Contains("<DIR>")) { string msg = line.Substring(line.LastIndexOf("<DIR>") + 5).Trim(); strs.Add(msg); } line = reader.ReadLine(); } reader.Close(); response.Close(); return strs; } catch (Exception ex) { Console.WriteLine("获取目录出错:" + ex.Message); } return strs; } /// <summary> /// 从ftp服务器上获得文件列表 /// </summary> /// <param name="RequedstPath">服务器下的相对路径</param> /// <returns></returns> public static List<string> GetFile(string RequedstPath) { List<string> strs = new List<string>(); try { string uri = path + RequedstPath; //目标路径 path为服务器地址 FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri)); // ftp用户名和密码 reqFTP.Credentials = new NetworkCredential(username, password); reqFTP.Method = WebRequestMethods.Ftp.ListDirectoryDetails; WebResponse response = reqFTP.GetResponse(); StreamReader reader = new StreamReader(response.GetResponseStream());//中文文件名 string line = reader.ReadLine(); while (line != null) { if (!line.Contains("<DIR>")) { string msg = line.Substring(39).Trim(); strs.Add(msg); } line = reader.ReadLine(); } reader.Close(); response.Close(); return strs; } catch (Exception ex) { Console.WriteLine("获取文件出错:" + ex.Message); } return strs; } //从ftp服务器上下载文件的功能 public void Download( string fileName) { FtpWebRequest reqFTP; try { string filePath = Application.StartupPath; FileStream outputStream = new FileStream(filePath + "\\" + fileName, FileMode.Create); reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(path + fileName)); reqFTP.Method = WebRequestMethods.Ftp.DownloadFile; reqFTP.UseBinary = true; reqFTP.Credentials = new NetworkCredential(username, password); reqFTP.UsePassive = false; FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse(); Stream ftpStream = response.GetResponseStream(); long cl = response.ContentLength; int bufferSize = 2048; int readCount; byte[] buffer = new byte[bufferSize]; readCount = ftpStream.Read(buffer, 0, bufferSize); while (readCount > 0) { outputStream.Write(buffer, 0, readCount); readCount = ftpStream.Read(buffer, 0, bufferSize); } ftpStream.Close(); outputStream.Close(); response.Close(); } catch (Exception ex) { throw ex; } } } } namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { FtpHelper m_ftp=new FtpHelper(); string[] list = FtpHelper.GetFileList("/"); m_ftp.Download("monitor_config.xml"); } } }
-
C# 通过ftp 下载文件失效
2014-11-24 03:19:45C# 通过ftp 下载文件失效? 下载下来的文件大小与服务器上大小相同,但是无法使用此文件. 也不报错,没异常,偶发性的. 通过vpn连到公司内网,再下载文件出现这样的情况比较高. 下载的文件是图片.查看图片时 下载的文件... -
python从ftp下载文件时问题解决
2019-11-12 15:35:42python从ftp下载文件代码如下 import os from ftplib import FTP def ftp_connect(host, username, password): ftp = FTP() # ftp.set_debuglevel(2) ftp.connect(host, 21) ftp.login(username, password)...python从ftp下载文件代码如下
import os
from ftplib import FTPdef ftp_connect(host, username, password):
ftp = FTP()
# ftp.set_debuglevel(2)
ftp.connect(host, 21)
ftp.login(username, password)
return ftp"""
从ftp服务器下载文件
"""
def download_file(ftp, remotepath, localpath):
bufsize = 1024
fp = open(localpath, 'wb')
ftp.retrbinary('RETR ' + remotepath, fp.write, bufsize)
ftp.set_debuglevel(0)
fp.close()"""
从本地上传文件到ftp
"""
def upload_file(ftp, remotepath, localpath):
bufsize = 1024
fp = open(localpath, 'rb')ftp.storbinary('STOR' + remotepath, fp, bufsize)
ftp.set_debuglevel(0)
fp.close()
if __name__ == "__main__":
ftp = ftp_connect("130.17.177.140", "ftp", "ftp0")
print(ftp)
download_file(ftp, r"/工作站文档统一存放位置/kpi_day_report/LTE/2019-11-09/LTE_KPI_质差小区日报_2019-11-09_莱芜.xlsx", r"D:/abc/LTE_KPI_质差小区日报_2019-11-09_莱芜.xlsx")
#调用本地播放器播放下载的视频
#os.system('start "C:\Program Files\Windows Media Player\wmplayer.exe" "C:/Users/Administrator/Desktop/test.mp4"')
#upload_file(ftp, r"IMG_0682.jpg", "E:\我们的照片\新建文件夹\IMG_0682.jpg")ftp.quit()
使用ftplib上传文件的时候,遇到包含中文的文件名报错
UnicodeEncodeError: 'latin-1' codec can't encode charactersin position 4-5: ordinal not in range(256)
查阅了很多网上的资料,发现在python自带的模块ftplib.py中定义了编码模式
vim /usr/local/python3/lib/python3.6/ftplib.py
初始的编码模式是
coding = 'latin-1'
后来笔者把他改成了‘utf-8’
但是问题并不能解决
最后笔者狠下心来把他改成了
encoding = "GB2312"
问题迎刃而解
-
C#FTP下载文件返回文件路径或者byte[]
2017-03-29 16:55:15FTP下载文件返回文件路径和返回byte[]方法,以PDF为例 FTP下载文件保存到本地并返回文件路径 public static string returnFilePath(string filePath, int yymxid) { FtpWebRequest reqFTP; try ... -
FTP下载文件到文件夹+进度条
2018-05-21 21:00:11任务是通过python FTP下载文件到内存 再到文件,好像没有搞清楚如何下载到内存,只是通过重载FTP中retrbinary函数,在里面增加打印下载进度条的功能,后面看到别人是拿pycurl做的,之后好好学习一下。from ftplib ... -
java从FTP下载文件功能
2017-08-25 10:59:22java从FTP下载文件功能,导出的时候会下载到浏览器默认下载文件夹里,360浏览器会弹出一个保存文件的弹出框 //下载导出报表 //JS function downloadExport(filename){ window.location.href=”/order-center/ui... -
Java FTP 下载文件和文件夹
2016-10-24 10:49:46Java FTP 下载文件和文件夹 Java FTP 2013-12-13 22:58:45 发布 您的评价: 0.0 收藏 0收藏 用apache下的common-net.jar包开发Java FTP下载功能 导入apache... -
java ftp下载文件
2019-08-02 12:22:491、使用官方正规的jar ...注意:使用ftp从windows服务器下载文件和从linux服务器下载文件不一样 2、用ftp从linux服务器下载文件 System.out.println(new Date()+" 开始进入ftpDownload定时器"); /... -
python ftp下载文件
2019-03-15 15:47:13# -*- coding: utf-8 -*- ...#实现从ftp上下载文件到本地 from ftplib import FTP import os def ftpconnect(host, username, password): ftp = FTP() # 设置变量 timeout = 30 port = 21 ... -
ruby通过ftp下载文件
2013-05-24 20:37:33Ruby 通过 FTP 下载文件 require 'net/ftp' 2 3 ftp = Net::FTP.new('ftp.ruby-lang.org') 4 ftp.passive = true 5 ftp.... -
Java中实现ftp下载文件至本地(详细)
2020-09-13 15:36:21Java中实现ftp下载文件至本地(详细): 2020-09-13:今天记录一下java中实现ftp下载文件至本地的功能模块,同此与大家交流分享有什么不对的地方大家可以指出! 1.FTP协议: 什么是FTP呢?FTP 是 TCP/IP 协议组中的... -
angularjs $http 如何使用路径地址去FTP下载文件?
2018-12-29 11:45:32angularjs $http 如何使用路径地址去FTP下载文件? -
从ftp下载文件(word)到本地显示文件损坏或错误
2019-07-17 23:40:04今天遇到问题从ftp下载文件到本地路径无法查看,发现是文件名称中含有比如空格,问号等非常规字符存在,虽然在本地创建了对应的文件,但是流无法识别一些非常规字符,所以即使下载到本地也显示文件损坏或错误。... -
使用FTP下载文件
2010-03-26 20:06:00FTP下载文件:创建FTP组件(get) 1、用一个InternetOpen调用设置环境。2、调用InternetConnect 函数与主机连接。3、调用FtpGetFile 达到文件。4、关闭第1、2步创建的句柄,用InternetCloseHandle 函数。InternetOpen... -
Shell实现FTP下载文件,并保存执行日志
2019-11-23 13:30:48分享知识 传递快乐 这篇文章是Linux实现FTP上传下载的续篇...FTP下载文件并保存执行日志 #!/bin/bash #auth hy ################################################ # # 定义函数 # #########################... -
java FTP 下载文件
2019-07-11 16:00:29package ... import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; import org.apache.commons.net.ftp.FTPReply; import java.io.File; import java... -
FTP下载文件失败
2016-12-05 15:01:00这几天的定时任务下载文件的脚本失败了。 于是手工执行测试,发现报550 Permission denied. Passive mode refused. 意思就是被动模式下,没有权限获取文件。 解决方案,在脚本中添加一行命令 passive,将被动模式... -
FTP下载 文件 200 Type set to A.
2014-12-17 04:00:25FTP下载 文件, 用IP 访问没问题,但一换成机器名访问就报:200 Type set to A. 机器名只有几个英文字母,应该没有什么关键字影响 -
linux 连接 ftp 下载文件
2018-04-13 10:29:17需要用root权限的,用下面语句登录root:[java] view plain copysudo -i 登出 exit安装ftp简单粗暴直接运行下面命令:[java] view plain copyyum -y install ftp P.S.还有一种ftp是:在linux中使用的FTP是... -
Linux ftp 下载文件需要权限
2018-05-18 16:10:28使用java下载ftp文件时,报错如下,  经过检验,并不是没有这个文件; 只是因为权限不够,我把这个文件权限给成777是可以的; 但是... -
ftp下载文件md5错误
2011-04-27 15:40:00使用ftp下载文件时出现md5和源文件不同的错误,后来搞了半天才弄清原来是传输模式的原因: 文件传送有两种方式,即ASCII码和二进制码。ASCII方式传送略快些,但要求被传送文件必须是ASCII码文本文件。二进制码方式... -
FTP下载文件失真问题
2018-05-17 16:52:00一开始我们使用的是普通的FTP下载方法,后来发现图片有失真问题,于是重新写了一种FTP的下载图片方法二、代码逻辑 public static boolean downloadImage(String hostname, int port, String username, String ... -
ftp下载文件 简单示例
2016-12-25 11:08:03注意:例如下载test01.txt 文件到本地 ,你本地必须有对应的text01.txt文件 这样才能下载 /** * 连接FTP服务器 * @return 连接 * @throws Exception */ public boolean connectFTPServer(FTPClientVO ... -
从FTP下载文件带进度条
2019-07-25 08:54:381 #region 获取FTP服务器上指定文件的大小 2 /// <summary> 3 /// 获取FTP服务器上指定文件的大小 4 /// </summary> 5 /// <param name="fileName">FTP服务器上的文件名</... -
JAVA 解决FTP下载文件不完整问题
2019-09-12 10:56:46在使用java的ftp下载服务器上的文件获取文件的byte[],然后对byte进行加密传输时, 注意是要获取byte[],而不是下载文件到本地; 发现下载的byte[]大小总是小于文件实际大小,并且下载的大小是变化的 到网上查阅... -
ftp 下载文件到 客户端输出流 文件名却是download
2015-09-23 10:38:32ftp 下载文件到 客户端输出流 文件名却是download 为下载的文件进行命名: response 设置如下: response.setContentType("application/x-msdownload"); response.setCharacterEncoding("UTF-8"); response....