zl程序教程

您现在的位置是:首页 >  后端

当前栏目

C#ftp服务器配置与文件上传

2023-06-13 09:15:10 时间

个人分享

public void test()
        {
            //ftp服务器路径
            string ftpServer = "ftp://192.168.0.1/";
            //ftp本地路径
            string ftpDefaultUrl = "/A";
            //登入到ftp的账号
            string ftpUserName = "anonymous";
            //登入到ftp的密码
            string ftpUserPwd = "";
            //下载后的文件存放路径
            string downloadUrl = @"D:\";
            //需要下载的文件名
            string fileName = "ip.txt";
            //需要现在的文件在ftp上的完整路径
            string fileUploadPath = ftpServer + ftpDefaultUrl;
            Uri uri = new Uri(fileUploadPath + "/" + fileName);
            //下载后存放的路径
            string FileName = Path.GetFullPath(downloadUrl) + Path.DirectorySeparatorChar.ToString() + Path.GetFileName(uri.LocalPath);

            //创建文件流
            FileStream fs = null;
            Stream responseStream = null;
            try
            {
                //创建一个与FTP服务器联系的FtpWebRequest对象
                FtpWebRequest request = (FtpWebRequest)WebRequest.Create(uri);
                //设置请求的方法是FTP文件下载
                request.Method = WebRequestMethods.Ftp.DownloadFile;
                //连接登录FTP服务器
                request.Credentials = new NetworkCredential(ftpUserName, ftpUserPwd);
                //获取一个请求响应对象
                FtpWebResponse response = (FtpWebResponse)request.GetResponse();
                //获取请求的响应流
                responseStream = response.GetResponseStream();
                //判断本地文件是否存在,如果存在,则打开和重写本地文件
                if (File.Exists(FileName))
                {
                    fs = File.Open(FileName, FileMode.Open, FileAccess.ReadWrite);
                }
                else
                {
                    fs = File.Create(FileName);
                }

                if (fs != null)
                {
                    int buffer_count = 65536;
                    byte[] buffer = new byte[buffer_count];
                    int size = 0;
                    while ((size = responseStream.Read(buffer, 0, buffer_count)) > 0)
                    {
                        fs.Write(buffer, 0, size);
                    }
                    fs.Flush();
                    fs.Close();
                    responseStream.Close();
                }
            }
            finally
            {
                if (fs != null)
                    fs.Close();
                if (responseStream != null)
                    responseStream.Close();
            }
        }

 实例以金蝶云星空举例,部分代码按个人需求来改,具体部分看注释

//<summary>
        //上传附件,并保存于单据关联关系。
        //</summary>
        public void Upload()
        {
            //上传附件至当前启用的文件服务实例。
            string filePath = @"D:\ip.txt"; //测试用附件地址。
            FileUploadResult uploadResult = UploadAttachment(filePath);
            //此处以金蝶云星空币别为例,按个人需求来配置。
            SaveAttachmentData(uploadResult);
        }

        //<summary>
        //上传附件,返回上传结果。
        //</summary>
        //<param name="filePath">应用服务器下测试文件路径。</param>
        //<returns>返回上传结果。</returns>
        private FileUploadResult UploadAttachment(string filePath)
        {
            FileUploadResult uploadResult = new FileUploadResult();
            long blockSize = 1024 * 1024; //分块上传大小。
            string fileName = Path.GetFileName(filePath);

            //获取上传下载服务。
            IUpDownloadService service = FileServiceContainer.GetUpDownloadService();
            TFileInfo tFile = new TFileInfo()
            {
                FileId = string.Empty, //文件编码。
                FileName = fileName, //文件名。
                CTX = this.Context, //登录上下文环境。
            };
            using (FileStream fsRead = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            {
                if (fsRead.Length <= 0) return uploadResult;
                while (true)
                {
                    //放里面声明,第一次填入完整字节数据,第二次若只填充一部分,此时后面的直接数组并不会被清空。
                    byte[] content = new byte[blockSize];
                    int size = fsRead.Read(content, 0, content.Length);
                    if (size == 0) break;

                    //不相等时说明已经是最后一次上传,也可能文件大小刚好等于1M,后面再读时size为0,不会再次上传。
                    tFile.Last = (size != blockSize);
                    tFile.Stream = new MemoryStream(content, 0, size);
                    uploadResult = service.UploadAttachment(tFile);
                    _fileId = tFile.FileId = uploadResult.FileId;
                    if (!uploadResult.Success || tFile.Last) break;
                }
            }
            return uploadResult;
        }

金蝶云星空相关代码

private void SaveAttachmentData(FileUploadResult uploadResult)
        {
            //构建附件明细实体数据包。
            FormMetadata meta = FormMetaDataCache.GetCachedFormMetaData(this.Context, FormIdConst.BOS_Attachment);
            DynamicObject dynObj = new DynamicObject(meta.BusinessInfo.GetDynamicObjectType());
            dynObj["BillType"] = "BD_Currency"; //业务单据唯一标识:此处关联币别。
            dynObj["InterID"] = 1; //业务单据内码:此处上传至人民币,内码为1。
            dynObj["BillNo"] = "PRE001"; //业务单据编码:此处上传至人民币,编码为PRE001。
            dynObj["EntryKey"] = " ";  //关联实体标识:单据头为空格,单据体则填单据体标识。
            dynObj["EntryInterID"] = -1; //单据体内码:单据头为-1,单据体则填单据体内码。
            dynObj["FileId"] = uploadResult.FileId; //文件编码:上面上传成功拿到文件编码。
            dynObj["FileStorage"] = "1"; //存储类型:1为文件服务器、2为亚马逊云存储、3为金蝶·个人云存储、4为金蝶·企业云存储。
            dynObj["AttachmentName"] = uploadResult.FileName; //附件名。
            dynObj["ExtName"] = Path.GetExtension(uploadResult.FileName); //文件后缀名。
            dynObj["AttachmentSize"] = Math.Round(uploadResult.FileSize * 1.0 / 1024, 2); //附件大小,单位为KB。
            dynObj["FBillStatus"] = "A"; //单据状态:给默认值A即可。
            dynObj["AliasFileName"] = ""; //别名。
            dynObj["IsAllowDownLoad"] = false; //是否禁止下载:false代表允许下载。
            dynObj["CreateMen_Id"] = this.Context.UserId; //创建人。
            dynObj["CreateTime"] = DateTime.Now; //创建时间。
            dynObj["ModifyMen_Id"] = this.Context.UserId; //修改人。
            dynObj["ModifyTime"] = DateTime.Now; //修改时间。

            //调用保存接口。
            dynObj = BusinessDataServiceHelper.Save(this.Context, dynObj);
        }
        private string _fileId = string.Empty;
    }