PHP远程附件上传

 

今天对ShuipFCMS程序增加了远程附件的功能。是利用FTP实现,下面贴出一个PHPCMS V9里面的一个FTP处理类,大致讲讲怎么实现远程附件的实现。

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

class Ftp {

        

    //FTP 连接资源

    private $link;

    //FTP连接时间

    public $link_time;

    //错误代码

    private $err_code = 0;

    //传送模式{文本模式:FTP_ASCII, 二进制模式:FTP_BINARY}

    public $mode = FTP_BINARY;

        

    /**

     * 连接FTP服务器

     * @param string $host       服务器地址

     * @param string $username   用户名

     * @param string $password   密码

     * @param integer $port       服务器端口,默认值为21

     * @param boolean $pasv        是否开启被动模式

     * @param boolean $ssl      是否使用SSL连接

     * @param integer $timeout     超时时间 

     */

    public function connect($host, $username = '', $password = '', $port = '21', $pasv = false, $ssl = false, $timeout = 30) {

        $start = time();

        if ($ssl) {

            if (!$this->link = @ftp_ssl_connect($host, $port, $timeout)) {

                $this->err_code = 1;

                return false;

            }

        } else {

            if (!$this->link = @ftp_connect($host, $port, $timeout)) {

                $this->err_code = 1;

                return false;

            }

        }

        

        if (@ftp_login($this->link, $username, $password)) {

            if ($pasv)

                ftp_pasv($this->link, true);

            $this->link_time = time() - $start;

            return true;

        } else {

            $this->err_code = 1;

            return false;

        }

        register_shutdown_function(array(&$this, 'close'));

    }

        

    /**

     * 创建文件夹

     * @param string $dirname 目录名,

     */

    public function mkdir($dirname) {

        if (!$this->link) {

            $this->err_code = 2;

            return false;

        }

        $dirname = $this->ck_dirname($dirname);

        $nowdir = '/';

        foreach ($dirname as $v) {

            if ($v && !$this->chdir($nowdir . $v)) {

                if ($nowdir)

                    $this->chdir($nowdir);

                @ftp_mkdir($this->link, $v);

            }

            if ($v)

                $nowdir .= $v . '/';

        }

        return true;

    }

        

    /**

     * 上传文件

     * @param string $remote 远程存放地址

     * @param string $local 本地存放地址

     */

    public function put($remote, $local) {

        if (!$this->link) {

            $this->err_code = 2;

            return false;

        }

        $dirname = pathinfo($remote, PATHINFO_DIRNAME);

        if (!$this->chdir($dirname)) {

            $this->mkdir($dirname);

        }

        if (@ftp_put($this->link, $remote, $local, $this->mode)) {

            return true;

        } else {

            $this->err_code = 7;

            return false;

        }

    }

        

    /**

     * 删除文件夹

     * @param string $dirname  目录地址

     * @param boolean $enforce 强制删除

     */

    public function rmdir($dirname, $enforce = false) {

        if (!$this->link) {

            $this->err_code = 2;

            return false;

        }

        $list = $this->nlist($dirname);

        if ($list && $enforce) {

            $this->chdir($dirname);

            foreach ($list as $v) {

                $this->f_delete($v);

            }

        } elseif ($list && !$enforce) {

            $this->err_code = 3;

            return false;

        }

        @ftp_rmdir($this->link, $dirname);

        return true;

    }

        

    /**

     * 删除指定文件

     * @param string $filename 文件名

     */

    public function f_delete($filename) {

        if (!$this->link) {

            $this->err_code = 2;

            return false;

        }

        if (@ftp_delete($this->link, $filename)) {

            return true;

        } else {

            $this->err_code = 4;

            return false;

        }

    }

        

    /**

     * 返回给定目录的文件列表

     * @param string $dirname  目录地址

     * @return array 文件列表数据

     */

    public function nlist($dirname) {

        if (!$this->link) {

            $this->err_code = 2;

            return false;

        }

        if ($list = @ftp_nlist($this->link, $dirname)) {

            return $list;

        } else {

            $this->err_code = 5;

            return false;

        }

    }

        

    /**

     * 在 FTP 服务器上改变当前目录

     * @param string $dirname 修改服务器上当前目录

     */

    public function chdir($dirname) {

        if (!$this->link) {

            $this->err_code = 2;

            return false;

        }

        if (@ftp_chdir($this->link, $dirname)) {

            return true;

        } else {

            $this->err_code = 6;

            return false;

        }

    }

        

    /**

     * 获取错误信息

     */

    public function get_error() {

        if (!$this->err_code)

            return false;

        $err_msg = array(

            '1' => 'Server can not connect',

            '2' => 'Not connect to server',

            '3' => 'Can not delete non-empty folder',

            '4' => 'Can not delete file',

            '5' => 'Can not get file list',

            '6' => 'Can not change the current directory on the server',

            '7' => 'Can not upload files'

        );

        return $err_msg[$this->err_code];

    }

        

    /**

     * 检测目录名

     * @param string $url 目录

     * @return 由 / 分开的返回数组

     */

    private function ck_dirname($url) {

        $url = str_replace('', '/', $url);

        $urls = explode('/', $url);

        return $urls;

    }

        

    /**

     * 关闭FTP连接

     */

    public function close() {

        return @ftp_close($this->link);

    }

        

}

 

先来说说远程附件上传的大致流程:

   用户选择文件上传提交到服务器->服务器接收到文件->服务器一些安全检测完成通过FTP功能上传到相应FTP服务器。

我说的只是一个大概过程,不是很标准,明白个意思即可啦!~

这个类大致使用方法:

  首先通过 $ftps->connect($host,$username,$password,$post,$pasv,$ssl,$timeout);进行FTP服务器连接。

  通过具体的函数进行FTP的操作。

   $ftps->mkdir() 创建目录,可以创建多级目录以“/abc/def/higk”的形式进行多级目录的创建。

   $ftps->put()上传文件

   $ftps->rmdir()删除目录

   $ftps->f_delete()删除文件

   $ftps->nlist()列出指定目录的文件

   $ftps->chdir()变更当前文件夹

   $ftps->get_error()获取错误信息

时间: 2024-10-01 01:03:27

PHP远程附件上传的相关文章

PHP ftp类实现远程附件上传例子

现在很多地方需要用ftp类操作另外的网站服务器,上传图片之类的.现在贴一个php ftp类给大家 class Ftp {             //FTP 连接资源     private $link;     //FTP连接时间     public $link_time;     //错误代码     private $err_code = 0;     //传送模式{文本模式:FTP_ASCII, 二进制模式:FTP_BINARY}     public $mode = FTP_BINA

ueditor 附件上传时,没出现上传文件的按钮

问题描述 ueditor 附件上传时,没出现上传文件的按钮 解决方案 上传配置的配置文件你没传你服务器吧,要发布网站后通过http访问才行的

simditor 附件上传-Simditor的附件上传实现

问题描述 Simditor的附件上传实现 Simditor 是一个开源的富编辑器,项目地址是:http://simditor.tower.im/ 现在我有一问题,想要请教大家一下:我要实现附件上传的功能(不是图片上传),我要实现的效果是跟tower的附件上传的效果一样,从这个项目的文档来看,我确实找不到附件上传的功能?难道我要自己按照它的规范开发一个上传的button? 但是tower居然都有已经有过这个上传附件的功能,这个项目开源,不会自己留有一手,故意没有开放这个功能吧? 如果我要自己实现的

xmlhttprequest-XMLHttpRequest附件上传

问题描述 XMLHttpRequest附件上传 请问各位大神在js中使用XMLHttpRequest如何将附件(file对象)上传到struts2的action中,在action中如何接收上传的附件数据? 解决方案 struts2.0多附件上传bugfree无法上传附件 解决方案二: 需要使用HTML5的FormData对象(IE10+才支持).html5 ajax上传文件 接收和普通表单一样,也要兼容所有浏览器可以找ajaxfileupload,或者jqury.form.js这个2个插件

救命啊问个附件上传的问题,求大神!

问题描述 附件上传,设想点击ipnu控件,打开文件选择框,选择文件后存到数据库,做法是隐藏一个fileuploaed控件,button控件调用他的click事件:<inputid="Button1"type="button"onclick="IDCardclick();"class="upfile"/>functionIDCardclick(){document.getElementById("FileU

hadoop-hdfs可以远程连接上传和下载吗?

问题描述 hdfs可以远程连接上传和下载吗? 目前需求是这样的:windows客户端想要上传mr作业jar包至hdfs上,程序部署在hdfs某个节点的linux服务器上,运行linux部署的程序,实现windows上的jar包上传(或下载)至hdfs,请问如何实现这个功能?谢谢大大们! hdfs提供有这样的远程调用接口吗?(hdfs的api接口copyFromLocalFile均是本地上传,不太符合目前的需求) 解决方案 sqoop 可以实现远程上传下载 解决方案二: sqoop 可以实现远程上

使用DOM动态创建js实现多附件上传客户端

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content

openerp-openErp 怎么使用附件上传到我自己定义的 表里面去 。

问题描述 openErp 怎么使用附件上传到我自己定义的 表里面去 . openErp 怎么使用附件上传到我自己定义的 表里面去 . 我定义了一个附件的class 在另 一个class 中one2many 指向附件表. 下面的我就不知道怎么做了. 跪求实现方式 解决方案 可以用one2many 继承附件表这样就可以了

ie 11-swfupload+extjs 多附件上传,在IE11中点击上传不起作用

问题描述 swfupload+extjs 多附件上传,在IE11中点击上传不起作用 原本在IE8下是可以上传的,最近公司IE升级为11上传控件就不能用了,更改IE的文档模式为8以下就OK.文档模式为edge就出现上传按钮没反应. 解决方案 是点击选择文件不起作用 解决方案二: 要加上classidhttp://www.wfk.name/archives/1139.html 解决方案三: /** * 多文件上传组件 * for extjs4.0 + struts2.0 + swfupload *