精华内容
下载资源
问答
  • corpsecretSecret是管理组凭证密钥 accesstoken = gettoken(corpid, corpsecret) media_id=get_media_id(accesstoken) senddata(accesstoken, media_id) 经过实际测试 成功将文件发送了微信

    不多废话,直接上代码:

    import urllib, urllib.request
    import json
    import sys
    import requests
    
    
    def gettoken(corpid, corpsecret):
        gettoken_url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=' + corpid + '&corpsecret=' + corpsecret
        print(gettoken_url)
        try:
            token_file = urllib.request.urlopen(gettoken_url)
        except urllib.request.HTTPError as e:
            print(e.code)
            print(e.read().decode("utf8"))
            sys.exit()
        token_data = token_file.read().decode('utf-8')
        token_json = json.loads(token_data)
        token_json.keys()
        token = token_json['access_token']
        return token
    
    def senddata(access_token, media_id):
        send_values = {
            "toparty": "2",  # 企业号中的部门id。根据自己实际修改
            "msgtype": "file",  # 消息类型。
            "agentid": "1000003",  # 企业号中的应用id。根据自己实际修改
            "file": {
                "media_id": media_id
            },
            "safe": "0",
            "enable_duplicate_check":"0",
            "duplicate_check_interval": "1800"
        }
    	# send_data = simplejson.dumps(send_values, ensure_ascii=False).encode('utf-8')
        # send_request = urllib.request.Request(send_url, send_data)
        # response = json.loads(urllib.request.urlopen(send_request).read().decode('utf-8'))
        send_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=' + access_token
        json_post_data=json.dumps(send_values, ensure_ascii=False).encode('utf-8')
        r = requests.post(send_url, data=json_post_data, headers={"Content-Type": "application/json; charset=utf-8"})
        print(str(r))	
    
    def get_media_id(token):
        url = 'https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token=' + token + '&type=file'
        files = {'file': open('C:/Users/byroot/Desktop/test/dede.txt', 'rb')}
        r = requests.post(url, files=files)
        re = json.loads(r.text)
        return re['media_id']
    
    
    if __name__ == '__main__':
     
        #这2参数根据自己实际修改
        corpid = 'xxxxxxxxxx'  # CorpID是企业号的标识
        corpsecret = 'xxxxxxxxxxx'  # corpsecretSecret是管理组凭证密钥
        accesstoken = gettoken(corpid, corpsecret)
        media_id=get_media_id(accesstoken)
        senddata(accesstoken, media_id)
    

    经过实际测试 成功将文件发送到了微信群

    展开全文
  • 问题咨询及项目源码请加,下载各类资源,学习各类技术,一起交流一起进步: QQ: 名称:IT项目交流 群号:245022761 FTP(文件传输协议)原理介绍及实现,附实现源代码 FTP 概述 文件传输协议(FTP...
    问题咨询及项目源码请加群,下载各类资源,学习各类技术,一起交流一起进步:
     
    QQ群:
     
    名称:IT项目交流群  
     
    群号:245022761

    FTP(文件传输协议)原理介绍及实现,附实现源代码

    FTP 概述

    文件传输协议(FTP)作为网络共享文件的传输协议,在网络应用软件中具有广泛的应用。FTP的目标是提高文件的共享性和可靠高效地传送数据。

    在传输文件时,FTP 客户端程序先与服务器建立连接,然后向服务器发送命令。服务器收到命令后给予响应,并执行命令。FTP 协议与操作系统无关,任何操作系统上的程序只要符合 FTP 协议,就可以相互传输数据。本文主要基于 LINUX 平台,对 FTP 客户端的实现原理进行详尽的解释并阐述如何使用 C 语言编写一个简单的 FTP 客户端。

    FTP 协议

    相比其他协议,如 HTTP 协议,FTP 协议要复杂一些。与一般的 C/S 应用不同点在于一般的C/S 应用程序一般只会建立一个 Socket 连接,这个连接同时处理服务器端和客户端的连接命令和数据传输。而FTP协议中将命令与数据分开传送的方法提高了效率。

    FTP 使用 2 个端口,一个数据端口和一个命令端口(也叫做控制端口)。这两个端口一般是21 (命令端口)和 20 (数据端口)。控制 Socket 用来传送命令,数据 Socket 是用于传送数据。每一个 FTP 命令发送之后,FTP 服务器都会返回一个字符串,其中包括一个响应代码和一些说明信息。其中的返回码主要是用于判断命令是否被成功执行了。

    命令端口

    一般来说,客户端有一个 Socket 用来连接 FTP 服务器的相关端口,它负责 FTP 命令的发送和接收返回的响应信息。一些操作如“登录”、“改变目录”、“删除文件”,依靠这个连接发送命令就可完成。

    数据端口

    对于有数据传输的操作,主要是显示目录列表,上传、下载文件,我们需要依靠另一个 Socket来完成。

    如果使用被动模式,通常服务器端会返回一个端口号。客户端需要用另开一个 Socket 来连接这个端口,然后我们可根据操作来发送命令,数据会通过新开的一个端口传输。

    如果使用主动模式,通常客户端会发送一个端口号给服务器端,并在这个端口监听。服务器需要连接到客户端开启的这个数据端口,并进行数据的传输。

    下面对 FTP 的主动模式和被动模式做一个简单的介绍。

    主动模式 (PORT)

    主动模式下,客户端随机打开一个大于 1024 的端口向服务器的命令端口 P,即 21 端口,发起连接,同时开放N +1 端口监听,并向服务器发出 “port N+1” 命令,由服务器从它自己的数据端口 (20) 主动连接到客户端指定的数据端口 (N+1)。

    FTP 的客户端只是告诉服务器自己的端口号,让服务器来连接客户端指定的端口。对于客户端的防火墙来说,这是从外部到内部的连接,可能会被阻塞。

    被动模式 (PASV)

    为了解决服务器发起到客户的连接问题,有了另一种 FTP 连接方式,即被动方式。命令连接和数据连接都由客户端发起,这样就解决了从服务器到客户端的数据端口的连接被防火墙过滤的问题。

    被动模式下,当开启一个 FTP 连接时,客户端打开两个任意的本地端口 (N > 1024 和 N+1) 。

    第一个端口连接服务器的 21 端口,提交 PASV 命令。然后,服务器会开启一个任意的端口 (P > 1024 ),返回如“227 entering passive mode (127,0,0,1,4,18)”。 它返回了 227 开头的信息,在括号中有以逗号隔开的六个数字,前四个指服务器的地址,最后两个,将倒数第二个乘 256 再加上最后一个数字,这就是 FTP 服务器开放的用来进行数据传输的端口。如得到 227 entering passive mode (h1,h2,h3,h4,p1,p2),那么端口号是 p1*256+p2,ip 地址为h1.h2.h3.h4。这意味着在服务器上有一个端口被开放。客户端收到命令取得端口号之后, 会通过 N+1 号端口连接服务器的端口 P,然后在两个端口之间进行数据传输。

    主要用到的 FTP 命令

    FTP 每个命令都有 3 到 4 个字母组成,命令后面跟参数,用空格分开。每个命令都以 "\r\n"结束。

    要下载或上传一个文件,首先要登入 FTP 服务器,然后发送命令,最后退出。这个过程中,主要用到的命令有 USER、PASS、SIZE、REST、CWD、RETR、PASV、PORT、QUIT。

    USER: 指定用户名。通常是控制连接后第一个发出的命令。“USER gaoleyi\r\n”: 用户名为gaoleyi 登录。

    PASS: 指定用户密码。该命令紧跟 USER 命令后。“PASS gaoleyi\r\n”:密码为 gaoleyi。

    SIZE: 从服务器上返回指定文件的大小。“SIZE file.txt\r\n”:如果 file.txt 文件存在,则返回该文件的大小。

    CWD: 改变工作目录。如:“CWD dirname\r\n”。

    PASV: 让服务器在数据端口监听,进入被动模式。如:“PASV\r\n”。

    PORT: 告诉 FTP 服务器客户端监听的端口号,让 FTP 服务器采用主动模式连接客户端。如:“PORT h1,h2,h3,h4,p1,p2”。

    RETR: 下载文件。“RETR file.txt \r\n”:下载文件 file.txt。

    STOR: 上传文件。“STOR file.txt\r\n”:上传文件 file.txt。

    REST: 该命令并不传送文件,而是略过指定点后的数据。此命令后应该跟其它要求文件传输的 FTP 命令。“REST 100\r\n”:重新指定文件传送的偏移量为 100 字节。

    QUIT: 关闭与服务器的连接。

    FTP 响应码

    客户端发送 FTP 命令后,服务器返回响应码。

    响应码用三位数字编码表示:

    第一个数字给出了命令状态的一般性指示,比如响应成功、失败或不完整。

    第二个数字是响应类型的分类,如 2 代表跟连接有关的响应,3 代表用户认证。

    第三个数字提供了更加详细的信息。

    第一个数字的含义如下:

    1 表示服务器正确接收信息,还未处理。

    2 表示服务器已经正确处理信息。

    3 表示服务器正确接收信息,正在处理。

    4 表示信息暂时错误。

    5 表示信息永久错误。

    第二个数字的含义如下:

    0 表示语法。

    1 表示系统状态和信息。

    2 表示连接状态。

    3 表示与用户认证有关的信息。

    4 表示未定义。

    5 表示与文件系统有关的信息。

    Socket 编程的几个重要步骤

    Socket 客户端编程主要步骤如下:

    1. socket() 创建一个 Socket
    2. connect() 与服务器连接
    3. write() 和 read() 进行会话
    4. close() 关闭 Socket

    Socket 服务器端编程主要步骤如下:

    1. socket() 创建一个 Socket
    2. bind()
    3. listen() 监听
    4. accept() 接收连接的请求
    5. write() 和 read() 进行会话
    6. close() 关闭 Socket

     

    实现 FTP 客户端上传下载功能

    下面让我们通过一个例子来对 FTP 客户端有一个深入的了解。本文实现的 FTP 客户端有下列功能:

    1. 客户端和 FTP 服务器建立 Socket 连接。
    2. 向服务器发送 USER、PASS 命令登录 FTP 服务器。
    3. 使用 PASV 命令得到服务器监听的端口号,建立数据连接。
    4. 使用 RETR/STOR 命令下载/上传文件。
    5. 在下载完毕后断开数据连接并发送 QUIT 命令退出。

    本例中使用的 FTP 服务器为 filezilla。在整个交互的过程中,控制连接始终处于连接的状态,数据连接在每传输一个文件时先打开,后关闭。

    客户端和 FTP 服务器建立 Socket 连接

    当客户端与服务器建立连接后,服务器会返回 220 的响应码和一些欢迎信息。

     

     

    清单 1. 客户端连接到 FTP 服务器,接收欢迎信息

    SOCKET control_sock;
    struct hostent *hp;
    struct sockaddr_in server;
    memset(&server, 0, sizeof(struct sockaddr_in));
    
    /* 初始化socket */
    control_sock = socket(AF_INET, SOCK_STREAM, 0);
    hp = gethostbyname(server_name);
    memcpy(&server.sin_addr, hp->h_addr, hp->h_length);
    server.sin_family = AF_INET;
    server.sin_port = htons(port);
    
    /* 连接到服务器端 */
    connect(control_sock,(struct sockaddr *)&server, sizeof(server));
    /* 客户端接收服务器端的一些欢迎信息 */
    read(control_sock, read_buf, read_len);

     

    客户端登录 FTP 服务器

    当客户端发送用户名和密码,服务器验证通过后,会返回 230 的响应码。然后客户端就可以向服务器端发送命令了。

     

    清单 2. 客户端发送用户名和密码,登入 FTP 服务器

    /* 命令 ”USER username\r\n” */
    sprintf(send_buf,"USER %s\r\n",username);
    /*客户端发送用户名到服务器端 */
    write(control_sock, send_buf, strlen(send_buf));
    /* 客户端接收服务器的响应码和信息,正常为 ”331 User name okay, need password.” */
    read(control_sock, read_buf, read_len);
    
    /* 命令 ”PASS password\r\n” */
    sprintf(send_buf,"PASS %s\r\n",password);
    /* 客户端发送密码到服务器端 */
    write(control_sock, send_buf, strlen(send_buf));
    /* 客户端接收服务器的响应码和信息,正常为 ”230 User logged in, proceed.” */
    read(control_sock, read_buf, read_len);

     

    客户端让 FTP 服务器进入被动模式

    当客户端在下载/上传文件前,要先发送命令让服务器进入被动模式。服务器会打开数据端口并监听。并返回响应码 227 和数据连接的端口号

     

    清单 3. 让服务器进入被动模式,在数据端口监听

    /* 命令 ”PASV\r\n” */
    sprintf(send_buf,"PASV\r\n");
    /* 客户端告诉服务器用被动模式 */
    write(control_sock, send_buf, strlen(send_buf));
    /*客户端接收服务器的响应码和新开的端口号,
    * 正常为 ”227 Entering passive mode (<h1,h2,h3,h4,p1,p2>)” */
    read(control_sock, read_buf, read_len);

    客户端通过被动模式下载文件

    当客户端发送命令下载文件。服务器会返回响应码 150,并向数据连接发送文件内容。

     

     

    清单 4. 客户端连接到 FTP 服务器的数据端口并下载文件

    /* 连接服务器新开的数据端口 */
    connect(data_sock,(struct sockaddr *)&server, sizeof(server));
    /* 命令 ”CWD dirname\r\n” */
    sprintf(send_buf,"CWD %s\r\n", dirname);
    /* 客户端发送命令改变工作目录 */
    write(control_sock, send_buf, strlen(send_buf));
    /* 客户端接收服务器的响应码和信息,正常为 ”250 Command okay.” */
    read(control_sock, read_buf, read_len);
    
    /* 命令 ”SIZE filename\r\n” */
    sprintf(send_buf,"SIZE %s\r\n",filename);
    /* 客户端发送命令从服务器端得到下载文件的大小 */
    write(control_sock, send_buf, strlen(send_buf));
    /* 客户端接收服务器的响应码和信息,正常为 ”213 <size>” */
    read(control_sock, read_buf, read_len);
    
    /* 命令 ”RETR filename\r\n” */
    sprintf(send_buf,"RETR %s\r\n",filename);
    /* 客户端发送命令从服务器端下载文件 */
    write(control_sock, send_buf, strlen(send_buf));
    /* 客户端接收服务器的响应码和信息,正常为 ”150 Opening data connection.” */
    read(control_sock, read_buf, read_len);
    
    /* 客户端创建文件 */
    file_handle = open(disk_name, CRFLAGS, RWXALL);
    for( ; ; ) {
    ... ...
    /* 客户端通过数据连接 从服务器接收文件内容 */
    read(data_sock, read_buf, read_len);
    /* 客户端写文件 */
    write(file_handle, read_buf, read_len);
    ... ...	
    }
    /* 客户端关闭文件 */
    rc = close(file_handle);

    客户端退出服务器

    当客户端下载完毕后,发送命令退出服务器,并关闭连接。服务器会返回响应码 200。

    清单 5. 客户端关闭数据连接,退出 FTP 服务器并关闭控制连接

    /* 客户端关闭数据连接 */
    close(data_sock);
    /* 客户端接收服务器的响应码和信息,正常为 ”226 Transfer complete.” */
    read(control_sock, read_buf, read_len);
    
    /* 命令 ”QUIT\r\n” */
    sprintf(send_buf,"QUIT\r\n");
    /* 客户端将断开与服务器端的连接 */
    write(control_sock, send_buf, strlen(send_buf));
    /* 客户端接收服务器的响应码,正常为 ”200 Closes connection.” */
    read(control_sock, read_buf, read_len);
    /* 客户端关闭控制连接 */
    close(control_sock);

    至此,下载文件已经完成。需要注意的是发送 FTP 命令的时候,在命令后要紧跟 “\r\n”,否则服务器不会返回信息。回车换行符号 “\r\n” 是 FTP 命令的结尾符号,当服务器接收到这个符号时,认为客户端发送的命令已经结束,开始处理。否则会继续等待。

     

    让我们来看一下 FTP 服务器这一端的响应情况:

    清单 6. 客户端下载文件时,FTP 服务器的响应输出

    (not logged in) (127.0.0.1)> Connected, sending welcome message...
    (not logged in) (127.0.0.1)> 220-FileZilla Server version 0.9.36 beta
    (not logged in) (127.0.0.1)> 220 hello gaoleyi
    (not logged in) (127.0.0.1)> USER gaoleyi
    (not logged in) (127.0.0.1)> 331 Password required for gaoleyi
    (not logged in) (127.0.0.1)> PASS *********
    gaoleyi (127.0.0.1)> 230 Logged on
    gaoleyi (127.0.0.1)> PWD 
    gaoleyi (127.0.0.1)> 257 "/" is current directory.
    gaoleyi (127.0.0.1)> SIZE file.txt
    gaoleyi (127.0.0.1)> 213 4096
    gaoleyi (127.0.0.1)> PASV
    gaoleyi (127.0.0.1)> 227 Entering Passive Mode (127,0,0,1,13,67)
    gaoleyi (127.0.0.1)> RETR file.txt
    gaoleyi (127.0.0.1)> 150 Connection accepted
    gaoleyi (127.0.0.1)> 226 Transfer OK
    gaoleyi (127.0.0.1)> QUIT
    gaoleyi (127.0.0.1)> 221 Goodbye

    首先,服务器准备就绪后返回 220。客户端接收到服务器端返回的响应码后,相继发送“USER username” 和 “PASS password” 命令登录。随后,服务器返回的响应码为 230 开头,说明客户端已经登入了。这时,客户端发送 PASV 命令让服务器进入被动模式。服务器返回如 “227 Entering Passive Mode (127,0,0,1,13,67)”,客户端从中得到端口号,然后连接到服务器的数据端口。接下来,客户端发送下载命令,服务器会返回响应码 150,并从数据端口发送数据。最后,服务器返回 “226 transfer complete”,表明数据传输完成。

    需要注意的是,客户端不要一次发送多条命令,例如我们要打开一个目录并且显示这个目录,我们得发送 CWD dirname,PASV,LIST。在发送完 CWD dirname 之后等待响应代码,然后再发送后面一条。当 PASV 返回之后,我们打开另一个 Socket 连接到相关端口上。然后发送 LIST,返回 125 之后在开始接收数据,最后返回 226 表明完成。

    在传输多个文件的过程中,需要注意的是每次新的传输都必须重新使用 PASV 获取新的端口号,接收完数据后应该关闭该数据连接,这样服务器才会返回一个 2XX 成功的响应。然后客户端可以继续下一个文件的传输。

    上传文件与下载文件相比,登入验证和切换被动模式都如出一辙,只需要改变发送到服务器端的命令,并通过数据连接发送文件内容。

    客户端通过被动模式向服务器上传文件

    当客户端发送命令上传文件,服务器会从数据连接接收文件。

     

    客户端通过主动模式向服务器上传文件

    到目前为止,本文介绍的都是客户端用被动模式进行文件的上传和下载。下面将介绍客户端用主动模式下载文件。

     

     

    清单 7. 用主动模式从 FTP 服务器下载文件的示例 C 程序
    ... ...
    SOCKET data_sock;
    data_sock = socket(AF_INET, SOCK_STREAM, 0);
    struct  sockaddr_in  name;
    name.sin_family = AF_INET;
    name.sin_addr.s_addr = htons(INADDR_ANY);
    server_port = p1*256+p2;
    length = sizeof(name);
    name.sin_port = htons(server_port);
    bind(server_sock, (struct sockaddr *)&name, length);
    struct  sockaddr_in client_name;
    length = sizeof(client_name);
    
    /* 客户端开始监听端口p1*256+p2 */
    listen(server_sock, 64); 
    
    /* 命令 ”PORT \r\n” */
    sprintf(send_buf,"PORT 1287,0,0,1,%d,%d\r\n", p1, p2);
    write(control_sock, send_buf,strlen(send_buf));
    /* 客户端接收服务器的响应码和信息,正常为 ”200 Port command successful” */
    read(control_sock, read_buf, read_len);
    
    sprintf(send_buf,"RETR filename.txt\r\n");
    write(control_sock, send_buf, strlen(send_buf));
    /* 客户端接收服务器的响应码和信息,正常为 ”150 Opening data channel for file transfer.” */
    read(control_sock, read_buf, read_len);
    
    /* ftp客户端接受服务器端的连接请求 */
    data_sock = accept(server_sock,(struct sockaddr *)&client_name, &length);
    ... ...
    
    file_handle = open(disk_name, ROFLAGS, RWXALL);
    for( ; ; ) {
    ... ...
    read(data_sock, read_buf, read_len);
    write(file_handle, read_buf, read_len);
    ... ...	
    }
    close(file_handle);

    客户端通过 PORT 命令告诉服务器连接自己的 p1*256+p2 端口。随后在这个端口进行监听,等待 FTP 服务器连接上来, 再通过这个数据端口来传输文件。PORT 方式在传送数据时,FTP 客户端其实就相当于一个服务器端,由 FTP 服务器主动连接自己。

    断点续传

    由于网络不稳定,在传输文件的过程中,可能会发生连接断开的情况,这时候需要客户端支持断点续传的功能,下次能够从上次终止的地方开始接着传送。需要使用命令 REST。如果在断开连接前,一个文件已经传输了 512 个字节。则断点续传开始的位置为 512,服务器会跳过传输文件的前 512 字节。

     

    清单 8. 从 FTP 服务器断点续传下载文件

    ... ...
    /* 命令 ”REST offset\r\n” */
    sprintf(send_buf,"REST %ld\r\n", offset);
    /* 客户端发送命令指定下载文件的偏移量 */
    write(control_sock, send_buf, strlen(send_buf)); 
    /* 客户端接收服务器的响应码和信息,
    *正常为 ”350 Restarting at <position>. Send STORE or RETRIEVE to initiate transfer.” */
    read(control_sock, read_buf, read_len); 
    ... ...
    
    /* 命令 ”RETR filename\r\n” */
    sprintf(send_buf,"RETR %s\r\n",filename);
    /* 客户端发送命令从服务器端下载文件, 并且跳过该文件的前offset字节*/
    write(control_sock, send_buf, strlen(send_buf));
    /* 客户端接收服务器的响应码和信息,*
    *正常为 ”150 Connection accepted, restarting at offset <position>” */
    read(control_sock, read_buf, read_len);
    ... ...
    
    file_handle = open(disk_name, CRFLAGS, RWXALL);
    /* 指向文件写入的初始位置 */
    lseek(file_handle, offset, SEEK_SET);
    ... ...

      

     附:代码实现,FTP文件上传实现,定时扫描文件夹上传指定格式文件,部分代码,全部代码请加群免费获取

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <sys/socket.h>
    #include <sys/types.h> 
    #include <netdb.h>
    #include <errno.h>
    #include <time.h>
    
    
    
    #define MAX_LEN 1024*1
    #define MAX_CMD_LEN 128
    
    static inline int ftp_socket_send(int fd, char *str)
    {
    	send(fd, str, strlen(str), 0);
    	return 0;
    }
    
    static inline int ftp_socket_recv(int fd, char *str)
    {
    	int size;
    	size = recv(fd, str, MAX_LEN-1, 0);
    	str[size] = 0;
    	
    	printf("ftp recv: %s\n",str);
    	return 0;
    }
    
    static int ftp_get_data_port(char *buff, in_port_t *port)
    {
    	int i = 0, j = 0;
    	short port_l = 0, port_h = 0;
    
        if (buff == NULL || port == NULL)
        {
            return -1;
        }
        // (192,168,186,1,4,0).
    	while (buff[i++] != '(');
    	while (j < 4)
    	{
    		if(buff[i++] == ',')
    			j++;
    	}
    
    	while (buff[i] != ',')
    	{
    		port_h *= 10;
    		port_h += buff[i] - 0x30;
    		i++;
    	}
    
    	i++;
    	while (buff[i] != ')')
    	{
    		port_l *= 10;
    		port_l += buff[i] - 0x30;
    		i++;
    	}
    
    	printf("data_port : %u\n", port_h << 8 | port_l);
    	*port = htons((short)(port_h << 8 | port_l));
    
    	return 0;
    }
    static int ftp_get_upload_file_name(const char *upload_file, char *file_name)
    {
        int i = 0;
        int path_lenth = 0;
    
        if (upload_file == NULL || file_name == NULL)
        {
            return -1;
        }
    
        path_lenth = strlen(upload_file);
    
        while (path_lenth - i > 0)
        {
            // find index of '/'
            if (upload_file[path_lenth - i]== 47)
            {
                i--;
                break;
            }
            i++;
        }
    
        strcpy(file_name, &upload_file[path_lenth - i]);
    
    
        return 0;
    }
    
    int ftp_upload(const char *ip, unsigned int port, const char *user, const char *pwd, const char *upload_file,const char *upload_name)
    {
    	int ret;
    	int size;
    	char buff[MAX_LEN];
    	char cmd[MAX_CMD_LEN];
        char file_name[256];
    	int fd_socket, fd_data;
    	struct sockaddr_in addr;
    	struct sockaddr_in data;
    	int send_ret=0;
    
    	addr.sin_family = AF_INET;
    	inet_aton(ip, &addr.sin_addr);
    	addr.sin_port   = htons(port);
    	data.sin_family = AF_INET;
    	inet_aton(ip, &data.sin_addr);
    
    	fd_socket = socket(AF_INET, SOCK_STREAM, 0);
        if (fd_socket == -1)
        {
            return -1;
        }
    
    	fd_data = socket(AF_INET, SOCK_STREAM, 0);
        if (fd_data == -1)
        {
    		close(fd_socket);
            return -1;
        }
    
    	ret = connect(fd_socket, (struct sockaddr *)&addr, sizeof(addr));
        if (ret != 0)
        {
    		close(fd_data);
    		close(fd_socket);
            printf("connet falied\n");
            return -1;
        }
        
    	size = recv(fd_socket, buff, MAX_LEN-1, 0);
    	buff[size] = 0;
    
        memset(cmd, 0, sizeof(cmd));
        sprintf(cmd, "USER %s\r\n", user);
        // ftp_socket_send(fd_socket, "PASS shikejun\r\n");
    	ftp_socket_send(fd_socket, cmd);
    	ftp_socket_recv(fd_socket, buff);
    
        memset(cmd, 0, sizeof(cmd));
        sprintf(cmd, "PASS %s\r\n", pwd);
    	ftp_socket_send(fd_socket, cmd);
    	ftp_socket_recv(fd_socket, buff);
    
    	ftp_socket_send(fd_socket, "SYST\r\n");
    	ftp_socket_recv(fd_socket, buff);
    
    	ftp_socket_send(fd_socket, "TYPE I\r\n");
    	ftp_socket_recv(fd_socket, buff);
    
    	ftp_socket_send(fd_socket, "PASV\r\n");
    	ftp_socket_recv(fd_socket, buff);
    
    	ftp_get_data_port(buff, &data.sin_port);
    
        memset(file_name, 0, sizeof(file_name));
    	if(upload_name==NULL||strlen(upload_name)<=1)
    	{
        	ftp_get_upload_file_name(upload_file, file_name);
    	}
    	else
    	{
    		strcpy(file_name,upload_name);
    	}
        memset(cmd, 0, sizeof(cmd));
        sprintf(cmd, "STOR %s\r\n", file_name);
    	ftp_socket_send(fd_socket, cmd);
    
    	ret = connect(fd_data, (struct sockaddr *)&data, sizeof(data));
        if (ret != 0)
        {
            printf("connet falied\n");
    		close(fd_data);
    		close(fd_socket);
            return -1;
        }
    
    	ftp_socket_recv(fd_socket, buff);
    
        int fd = open(upload_file, O_RDONLY);
        if (fd == -1)
        {
            printf("open: \n");
    		close(fd_data);
    		close(fd_socket);
            return -1;
        }
    
        while ((ret = read(fd, buff, sizeof(buff))) > 0)
        {
            send_ret = send(fd_data, buff, ret, 0);
            if(send_ret<=0)
            {
            	break;
            }
            usleep(30*1000);
        }
        
        close(fd);
    	close(fd_data);
    
    	ftp_socket_recv(fd_socket, buff);
    
    	close(fd_socket);
    	
    	printf("ftp_upload [%s] [%s] result: %s\n",upload_file,upload_name,buff);
    
    	return 0;
    }

    附上本人在大学学习期间所有学习实现的demo,这些项目的实现都通过本人亲自测试运行,也是自己学习中知识的一点一点积累,整理不易,希望能帮到大家,不足之处大家多多交流。

    项目源码请加群下载:

    QQ群:

    名称:IT项目交流群  

    群号:245022761

     

     

     

    世界不同角落共同努力,变成更优秀的我们。

     

    1.51单片机学习整理

     

    基于51单片机的智能光控路灯 :https://download.csdn.net/download/qq_37037348/11071869

    基于51单片机超声波测距(内含源程序,原理图及PCB源文件):https://download.csdn.net/download/qq_37037348/11071866

     

     

    基于51单片机的智能安防报警系统:https://download.csdn.net/download/qq_37037348/11071865

     

    基于51单片机模块化编程模块 (红外、液晶显示屏、温湿度等传感器模块化)

    :https://download.csdn.net/download/qq_37037348/11053222

     

    基于51单片机pwm控制的呼吸灯程序

    https://download.csdn.net/download/qq_37037348/11053195

     

    51单片机与上位机串口通信实例包含详细讲解的完整代码

    https://download.csdn.net/download/qq_37037348/11053164

     

     

    基于51单片机的直交流电压表仿真 (详细代码实现,设计讲解)

    https://download.csdn.net/download/qq_37037348/11053145

     

     

     

    基于51单片机胸牌 详细代码实现,设计讲解)

    https://download.csdn.net/download/qq_37037348/11053125

     

    基于51单片机3x4按键拨号 (详细代码实现,设计讲解)

    https://download.csdn.net/download/qq_37037348/11053093

     

     

    基于51单片机拨号 (详细代码实现,设计讲解)

     

    https://download.csdn.net/download/qq_37037348/11053090

     

     

    基于51单片机警灯系统设计(详细代码实现,设计讲解)

    https://download.csdn.net/download/qq_37037348/11053086

     

     

    基于51单片机点亮一个小灯(详细代码实现,设计讲解,学习51基础实验)

    https://download.csdn.net/download/qq_37037348/11053084

     

    基于51单片机开发的排球计时器,附有详细注释讲解,为大家提供最真心的帮助

    https://download.csdn.net/download/qq_37037348/11053024

     

     

    基于51单片机的音乐播放器,源码详细注释

    https://download.csdn.net/download/qq_37037348/11053022

     

     

     

    2.Android 开发学习整理:

     

    Android-serialport 手机App串口通信代码实现:

     

    https://download.csdn.net/download/qq_37037348/11050521

     

    Android-serialport 手机App网络通信实例代码实现:

    https://download.csdn.net/download/qq_37037348/11050516

     

    Android 第一个App详细教程、基础实验 :

    https://download.csdn.net/download/qq_37037348/11050515

     

     

    3.计算机视觉(深度学习、神经网络的学习)

     

    feature extraction(深度学习,特征提取,神经网络:https://download.csdn.net/download/qq_37037348/11065968

     

    feature extraction(深度学习,特征提取,神经网络多种训练模型详细实现):

    https://download.csdn.net/download/qq_37037348/11065974

     

    欢迎大家加入学习项目交流,为大家分享各类个人学习项目及学习资料,互相交流互相学习。

    问题咨询及项目源码请加群:

    QQ群:

    名称:IT项目交流群  

    群号:245022761

     

    展开全文
  • 安装FTP 将本地项目或者文件上传到linux上 1-搭建FTP服务器   FTP是指File Transfer Protocol(文件传输协议),主要实现两个功能:上传,将本地文件上传到远程计算机;   1.1. 挂载光驱 mkdir /mnt/cdrom...

    安装FTP  将本地项目或者文件上传到linux上

    1-搭建FTP服务器

     

    FTP是指File Transfer Protocol(文件传输协议),主要实现两个功能:上传,将本地文件上传到远程计算机;

     

    1.1. 挂载光驱

    mkdir /mnt/cdrom

    mount /dev/cdrom  /mnt/cdrom   //挂载光驱(需要先创建挂载目录) 

    /dev/cdrom - > 虚拟机光驱

    错误情况:

    原因:CD/DVD没有连接

    解决方案:

    1、

     

    2、

    将CD/DVD  连接起来

    挂载成功:

    umount  /mnt/cdrom  //卸载挂载点(如果多次挂载,卸载其中一个挂载点,其他挂载点可以正常使用)

    1.1. 安装FTP服务

    1.1.1. 关闭selinux:

    vim /etc/selinux/config

    修改前:

     

    修改为:

     

    注意:重新启动centos(Linux操作系统)reboot

     

    重启系统后要重新挂载

    1.1.1. 从系统光盘安装vsftpd

    Vsftpd这个软件在光盘的Packages目录下

    安装:

    rpm -ivh /mnt/cdrom/Packages/vsftpd-2.2.2-11.el6_4.1.i686.rpm

     

    查询:

    使用rpm -q vsftpd 查询是否安装成功

    rpm -qa | grep vsftpd

    删除:

    rpm –e <包的名字>

    rpm -e  vsftpd-2.2.2-11.el6_4.1.i686

    1.1.2. 配置linux防火墙 

    输入setup命令进入系统配置

     

    选择防火墙配置

     

     

    选择定制

     

     

    选中ftp(用空格键来选择或取消),运行ftp协议穿过防火墙,点确定

     

    确定

    后面还有很多截图    需要的可以加群 858507220。

     

    展开全文
  • 微信企业号上传媒体文件之服务器文件上传,企业在使用接口时,对多媒体文件、多媒体消息的获取和调用等操作,是通过media_id来进行的。通过接口...

    微信企业号上传媒体文件之服务器文件上传

    企业在使用接口时,对多媒体文件、多媒体消息的获取和调用等操作,是通过media_id来进行的。
    通过接口https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE,企业可以上传多媒体文件。
    注意,每个多媒体文件(media_id)会在上传到微信服务器3天后自动删除,以节省服务器资源。

    通常文件上传是通过html表单进行的,通过HttpURLConnection 可以不经过浏览器直接在服务器端进行表单的POST提交,完成文件上传功能!
    需要注意的是,文件名必须是完整的绝对路径。
    如在windows 环境下:D:\\file\\123我是一个中午名称的文件.docx

    简单流程描述:
    1.定义数据分隔线  (boundary分割参数,长度建议10位以上)。
    2.与微信服务器建立链接(HttpURLConnection)
    3.获取上传文件输出流,准备往微信服务器写数据
    4.构造请求体等相关参数开始向微信服务器写数据(form-data中媒体文件标识,有filename、filelength、content-type等信息,其中file的表单名称为media )。

    5.读取上传文件后微信服务器返回的内容,并用json解析并返回(定义BufferedReader输入流来读取URL的响应)

    具体实现代码:

    package org.oms.qiye;
    
    import java.io.BufferedInputStream;
    import java.io.BufferedReader;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    
    import net.sf.json.JSONObject;
    
    public class WXUpload {
    	private static final String upload_wechat_url = "https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE";
    	public static JSONObject upload(String accessToken, String type, String fileUrl) {
    		JSONObject jsonObject = null;
    		String last_wechat_url = upload_wechat_url.replace("ACCESS_TOKEN", accessToken).replace("TYPE", type);
    		// 定义数据分割符
    		String boundary = "----------sunlight";
    		try {
    			URL uploadUrl = new URL(last_wechat_url);
    			HttpURLConnection uploadConn = (HttpURLConnection) uploadUrl.openConnection();
    			uploadConn.setDoOutput(true);
    			uploadConn.setDoInput(true);
    			uploadConn.setRequestMethod("POST");
    			// 设置请求头Content-Type
    			uploadConn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
    			// 获取媒体文件上传的输出流(往微信服务器写数据)
    			OutputStream outputStream = uploadConn.getOutputStream();
    
    			URL mediaUrl = new URL(fileUrl);
    			HttpURLConnection meidaConn = (HttpURLConnection) mediaUrl.openConnection();
    			meidaConn.setDoOutput(true);
    			meidaConn.setRequestMethod("GET");
    
    			// 从请求头中获取内容类型
    			String contentType = meidaConn.getHeaderField("Content-Type");
    			String filename=getFileName(fileUrl,contentType);
    			// 请求体开始
    			outputStream.write(("--" + boundary + "\r\n").getBytes());
    			outputStream.write(String.format("Content-Disposition: form-data; name=\"media\"; filename=\"%s\"\r\n", filename).getBytes());
    			outputStream.write(String.format("Content-Type: %s\r\n\r\n", contentType).getBytes());
    
    			// 获取媒体文件的输入流(读取文件)
    			BufferedInputStream bis = new BufferedInputStream(meidaConn.getInputStream());
    			byte[] buf = new byte[1024 * 8];
    			int size = 0;
    			while ((size = bis.read(buf)) != -1) {
    				// 将媒体文件写到输出流(往微信服务器写数据)
    				outputStream.write(buf, 0, size);
    			}
    			// 请求体结束
    			outputStream.write(("\r\n--" + boundary + "--\r\n").getBytes());
    			outputStream.close();
    			bis.close();
    			meidaConn.disconnect();
    
    			// 获取媒体文件上传的输入流(从微信服务器读数据)
    			InputStream inputStream = uploadConn.getInputStream();
    			InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
    			BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
    			StringBuffer buffer = new StringBuffer();
    			String str = null;
    			while ((str = bufferedReader.readLine()) != null) {
    				buffer.append(str);
    			}
    			bufferedReader.close();
    			inputStreamReader.close();
    			// 释放资源
    			inputStream.close();
    			inputStream = null;
    			uploadConn.disconnect();
    			// 使用json解析
    			jsonObject = JSONObject.fromObject(buffer.toString());
    			System.out.println(jsonObject);
    		} catch (Exception e) {
    			System.out.println("上传文件失败!");
    			e.printStackTrace();
    		}
    		return jsonObject;
    	}
    
    	public static String getFileName(String fileUrl,String contentType) {
    		String filename="";
    		if (fileUrl != null && !"".equals(fileUrl)) {
    			if(fileUrl.contains(".")){
    				filename = fileUrl.substring(fileUrl.lastIndexOf("/") + 1);
    			}else{
    				if(contentType==null || "".equals(contentType)){
    					return "";
    				}
    				String fileExt="";
    				if ("image/jpeg".equals(contentType)) {
    					fileExt = ".jpg";
    				} else if ("audio/mpeg".equals(contentType)) {
    					fileExt = ".mp3";
    				} else if ("audio/amr".equals(contentType)) {
    					fileExt = ".amr";
    				} else if ("video/mp4".equals(contentType)) {
    					fileExt = ".mp4";
    				} else if ("video/mpeg4".equals(contentType)) {
    					fileExt = ".mp4";
    				} else if ("text/plain".equals(contentType)) {
    					fileExt = ".txt";
    				} else if ("text/xml".equals(contentType)) {
    					fileExt = ".xml";
    				} else if ("application/pdf".equals(contentType)) {
    					fileExt = ".pdf";
    				} else if ("application/msword".equals(contentType)) {
    					fileExt = ".doc";
    				} else if ("application/vnd.ms-powerpoint".equals(contentType)) {
    					fileExt = ".ppt";
    				} else if ("application/vnd.ms-excel".equals(contentType)) {
    					fileExt = ".xls";
    				}
    				filename="Media文件"+fileExt;
    			}
    		}
    		return filename;
    	}
    }
    

    以上就是微信企业号上传自己服务器文件到微信服务器的方法,此方法中文文件名称不会乱码!


    转载请注明出处,以免惨不忍睹!

    技术交流请加入QQ群:点击链接加入群【微信企业号开发交流】:http://jq.qq.com/?_wv=1027&k=RgbtOX

    QQ群:89714226
    展开全文
  • 微信企业号上传媒体文件之本地文件上传,企业在使用接口时,对多媒体文件、多媒体消息的获取和调用等操作,是通过media_id来进行的。通过接口ttps://qyapi.weixin.qq....
  • 最近qq上传群文件老是失败,当时同事他们可以,目前已经解决QQ群、讨论组上传文件,由于网络原因上传失败?,做法如下: 输入regedit,打开注册表,然后找到这个位置HKEY_CURRENT_USER\Software\Microsoft\Windows\...
  • 众所皆知,web上传大文件,一直是一个痛。上传文件大小限制,页面响应...大文件上传及断点续,要求:支持50G级的单个文件上传和续。续要求:在刷新浏览器后能够续上传,在重启浏览器后能够继续上传上(关...
  • 这里我给了两个简单例子,是使用talend 将本地文件或者mysql文件上传到hadoop/hdfs。 CSDN上可以下载这两个资源: http://download.csdn.net/download/yepeng2007fei/9538120 ...或者点击链接加入【R语
  • QQ、讨论组上传文件,由于网络原因上传失败? 听语音 | 浏览:194 | 更新:2016-10-29 14:17 | 标签:软件 电脑  1 2 3 4 分步阅读 QQ、讨论组上传文件,...
  • 文件分片、并发上传,断点续,秒 第二弹

    万次阅读 多人点赞 2017-01-23 12:01:25
    继上次大文件分块上传原理见:http://blog.csdn.net/haohao123nana/article/details/51279098,博主终于有时间来真正的代码实现它。关键部分 前端用file.slice()分块 前端用FileReader获取每一分块的md5值 后端用...
  • 这一方面,我也一直没有做过,今天就抽出了一点时间来学习一下。现在的示例已经ok了,我就给大家分享一下,希望对...伪专家jqm文件上传 伪专家jqm文件上传 如有疑问:请加qq135430763,共同学习!!
  • 在虚拟机下进去 cd /usr/local/ 然后使用命令: chmod 777 webapps,即可实现图一的成功图片。...三、操作对象:u 用户user,表现文件或目录的所有者 g 用户组group,表现文件或目录所属的用户组 o...
  • java上传文件到FTP服务器

    万次阅读 2019-03-17 00:58:52
    前段时间,项目中使用到了上传文件到FTP服务器,再此略作整理,形成一个util工具,方便日后使用。 项目代码已上传至github:https://github.com/hack-feng/ftpdemo.git 点击直接前往 首先定义一个FTP服务器和上传...
  • 看到侯同学在群里发了原始的数据文件.mdb 作为划水大佬,怎么可能会自己输入数据呢 于是就导入数据,但是导入的过程并不理想 (原来mdb文件是Access的) 以下是导入的过程实例 如果中间有问题请私信我。 首先打开SQL...
  • 使用windows键+R打开运行对话框并输入regedit打开注册表编辑器,然后找到这个位置:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections这个位置下的所有条目删掉就行了...
  • IOS开发之文件上传

    千次阅读 2014-08-28 21:18:06
     在移动应用开发 文件形式上传是必不可少的,最近IOS这块文件上传文件代码简单的整理一下,如果大家有需要安卓这边的代码,本人也可以分享给大家!QQ:74432915 欢迎大家一起探讨 首先本demo采用网上开源框架...
  • 首先,对于大家而言,想必对网络传输并不陌生,因为我们每天都在下载“文件”。嘻嘻!!!但是如果让我们自己写一个网络文件传输的程序,估计大家都傻眼了,今天小编就给大家以最简单的方式,让C#初学者能够快速开发...
  • 在某些业务中,大文件上传是一个比较重要的交互场景,如上入库比较大的Excel表格数据、上传影音文件等。如果文件体积比较大,或者网络条件不好时,上传的时间会比较长(要传输更多的报文,丢包重的概率也更大)...
  • 将本地文件上传到GitLab

    千次阅读 2019-11-05 13:25:08
    登录GitLab服务器,点击“New Project”,开始创建空项目。 选择Blank Project。在项目中输入项目名字、项目描述(可选)和项目的可见性。然后点击 Create Project 。这样一个空的项目就建立好了。 这样我们就...
  • 群里看到有人这些东西搞成zip上传到群里,我它下载下来后解压就成这样了,请问 他是怎么做的?![图片说明](https://img-ask.csdn.net/upload/201510/19/1445220595_433673.jpg)
  • 这几天项目上有些文件都放在了Q上,可是发现只要稍微大一点的文件基本都是下载失败,不是网络错误就是下载半天才下好,现在介绍一下解决的办法: 1- 百度上搜索“空间” 2- 登录你的QQ账号 3- 在右上角有我的QQ...
  • js文件上传—图片压缩

    千次阅读 2017-03-25 13:06:37
    使用现有现有后台文件上传处理代码,即:不可修改后台处理代码。 —技术问题— js如何压缩图片,图片压缩后如何上传后台,上传后台又如何处理。 —现有技术— js对图片可以进行压缩。 —待解决问题— 图片压缩...
  • 微信小程序环境下将文件上传到 OSS

    千次阅读 2019-05-30 23:35:33
    客户端进行表单直传到 OSS 时,会从浏览器向 OSS 发送带有 Origin 的请求消息。OSS 对带有 Origin 头的请求消息会进行跨域规则(CORS)的验证。因此需要为 Bucket 设置跨域规则以支持 Post 方法。 步骤 2:配置外网...
  • 所有这些操作都涉及一个技术,那就是文件上传。 在PHP中,有一些内置的文件操作函数,然后再加上一自定义的函数,就可以很清楚的实现文件上传这一操作,今天我就以一个案例的形式来说一说PHP文件上传的实现过程。
  • 开发交流QQ:173683895 173683895 526474645 人满的请加其它 上传功能你会用到其他语言来接受数据,比如说php 你可以找到php.ini文件, 编辑该文件 搜索:memory_limit、post_max_size、upload_max_filesize、...
  • 在某些业务中,大文件上传是一个比较重要的交互场景,如上入库比较大的Excel表格数据、上传影音文件等。如果文件体积比较大,或者网络条件不好时,上传的时间会比较长(要传输更多的报文,丢包重的概率也更大)...
  • C# 上传文件到服务器

    千次阅读 2018-03-07 11:54:44
    QQ技术交流群号:601122412 看代码 多的就不解释了 2个图都差不多;
  • java两台服务器之间,大文件上传(续),采用了Socket通信机制,具体思路如下:实现思路: 1、服:利用ServerSocket搭建服务器,开启相应端口,进行长连接操作 2、服:使用ServerSocket.accept()方法进行...
  • 微信小程序上传word、txt、Excel、PPT等文件

    万次阅读 热门讨论 2018-06-10 11:08:17
    微信小程序开发交流qq 173683895 承接微信小程序开发。扫码加微信。 ; 正文: ...3.后端php接收文件并存一个服务器文件夹,文件名存数据库以后检索用 4.在微信小程序创建一个页面...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 65,684
精华内容 26,273
关键字:

怎么把文件上传到群文件里