简单的Python文件服务器和HTTP POST上传文件C代码

简介: 简单的Python文件服务器和HTTP POST上传文件C代码

代码都是网上收集的,已经打包提供下载。


文件服务器:

#!/usr/bin/env python  
"""Simple HTTP Server With Upload. 
This module builds on BaseHTTPServer by implementing the standard GET 
and HEAD requests in a fairly straightforward manner. 
"""  
__version__ = "0.1"  
__all__ = ["SimpleHTTPRequestHandler"]  
__author__ = "bones7456"  
__home_page__ = "http://luy.li/"  
import os  
import posixpath  
import BaseHTTPServer  
import urllib  
import cgi  
import shutil  
import mimetypes  
import re  
try:  
    from cStringIO import StringIO  
except ImportError:  
    from StringIO import StringIO  
class SimpleHTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):  
    """Simple HTTP request handler with GET/HEAD/POST commands. 
    This serves files from the current directory and any of its 
    subdirectories.  The MIME type for files is determined by 
    calling the .guess_type() method. And can reveive file uploaded 
    by client. 
    The GET/HEAD/POST requests are identical except that the HEAD 
    request omits the actual contents of the file. 
    """  
    server_version = "SimpleHTTPWithUpload/" + __version__  
    def do_GET(self):  
        """Serve a GET request."""  
        f = self.send_head()  
        if f:  
            self.copyfile(f, self.wfile)  
            f.close()  
    def do_HEAD(self):  
        """Serve a HEAD request."""  
        f = self.send_head()  
        if f:  
            f.close()  
    def do_POST(self):  
        """Serve a POST request."""  
        r, info = self.deal_post_data()  
        print r, info, "by: ", self.client_address  
        f = StringIO()  
        f.write('<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">')  
        f.write("<html>\n<title>Upload Result Page</title>\n")  
        f.write("<body>\n<h2>Upload Result Page</h2>\n")  
        f.write("<hr>\n")  
        if r:  
            f.write("<strong>Success:</strong>")  
        else:  
            f.write("<strong>Failed:</strong>")  
        f.write(info)  
        f.write("<br><a href=\"%s\">back</a>")
# % self.headers['referer'])  
        f.write("<hr><small>Powered By: bones7456, check new version at ")  
        f.write("<a href=\"http://luy.li/?s=SimpleHTTPServerWithUpload\">")  
        f.write("here</a>.</small></body>\n</html>\n")  
        length = f.tell()  
        f.seek(0)  
        self.send_response(200)  
        self.send_header("Content-type", "text/html")  
        self.send_header("Content-Length", str(length))  
        self.end_headers()  
        if f:  
            self.copyfile(f, self.wfile)  
            f.close()  
    def deal_post_data(self):  
        boundary = self.headers.plisttext.split("=")[1]  
        remainbytes = int(self.headers['content-length'])
        line = self.rfile.readline()  
        remainbytes -= len(line)  
        if not boundary in line:  
            return (False, "Content NOT begin with boundary")  
        # may have two Content-Disposition headers. and name= ?
        line = self.rfile.readline()  
        remainbytes -= len(line)  
        fn = re.findall(r'Content-Disposition.*name="file"; filename="(.*)"', line)  
        if not fn:
            return (False, "Can't find out file name...")  
        path = self.translate_path(self.path)  
        fn = os.path.join(path, fn[0])  
        #while os.path.exists(fn):  
        #    fn += "_"  
        line = self.rfile.readline()  
        remainbytes -= len(line)  
        line = self.rfile.readline()  
        remainbytes -= len(line)  
        try:  
            out = open(fn, 'wb')  
        except IOError:  
            return (False, "Can't create file to write, do you have permission to write?")  
        preline = self.rfile.readline()  
        remainbytes -= len(preline)  
        while remainbytes > 0:  
            line = self.rfile.readline()  
            remainbytes -= len(line)  
            if boundary in line:  
                preline = preline[0:-1]  
                if preline.endswith('\r'):  
                    preline = preline[0:-1]  
                out.write(preline)  
                out.close()  
                return (True, "File '%s' upload success!" % fn)  
            else:  
                out.write(preline)  
                preline = line  
        return (False, "Unexpect Ends of data.")  
    def send_head(self):  
        """Common code for GET and HEAD commands. 
        This sends the response code and MIME headers. 
        Return value is either a file object (which has to be copied 
        to the outputfile by the caller unless the command was HEAD, 
        and must be closed by the caller under all circumstances), or 
        None, in which case the caller has nothing further to do. 
        """  
        path = self.translate_path(self.path)  
        f = None  
        if os.path.isdir(path):  
            if not self.path.endswith('/'):  
                # redirect browser - doing basically what apache does  
                self.send_response(301)  
                self.send_header("Location", self.path + "/")  
                self.end_headers()  
                return None  
            for index in "index.html", "index.htm":  
                index = os.path.join(path, index)  
                if os.path.exists(index):  
                    path = index  
                    break  
            else:  
                return self.list_directory(path)  
        ctype = self.guess_type(path)  
        try:  
            # Always read in binary mode. Opening files in text mode may cause  
            # newline translations, making the actual size of the content  
            # transmitted *less* than the content-length!  
            f = open(path, 'rb')  
        except IOError:  
            self.send_error(404, "File not found")  
            return None  
        self.send_response(200)  
        self.send_header("Content-type", ctype)  
        fs = os.fstat(f.fileno())  
        self.send_header("Content-Length", str(fs[6]))  
        self.send_header("Last-Modified", self.date_time_string(fs.st_mtime))  
        self.end_headers()  
        return f  
    def list_directory(self, path):  
        """Helper to produce a directory listing (absent index.html). 
        Return value is either a file object, or None (indicating an 
        error).  In either case, the headers are sent, making the 
        interface the same as for send_head(). 
        """  
        try:  
            list = os.listdir(path)  
        except os.error:  
            self.send_error(404, "No permission to list directory")  
            return None  
        list.sort(key=lambda a: a.lower())  
        f = StringIO()  
        displaypath = cgi.escape(urllib.unquote(self.path))  
        f.write('<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">')  
        f.write("<html>\n<title>Directory listing for %s</title>\n" % displaypath)  
        f.write("<body>\n<h2>Directory listing for %s</h2>\n" % displaypath)  
        f.write("<hr>\n")  
        f.write("<form ENCTYPE=\"multipart/form-data\" method=\"post\">")  
        f.write("<input name=\"file\" type=\"file\"/>")  
        f.write("<input type=\"submit\" value=\"upload\"/></form>\n")  
        f.write("<hr>\n<ul>\n")  
        for name in list:  
            fullname = os.path.join(path, name)  
            displayname = linkname = name  
            # Append / for directories or @ for symbolic links  
            if os.path.isdir(fullname):  
                displayname = name + "/"  
                linkname = name + "/"  
            if os.path.islink(fullname):  
                displayname = name + "@"  
                # Note: a link to a directory displays with @ and links with /  
            f.write('<li><a href="%s">%s</a>\n'  
                    % (urllib.quote(linkname), cgi.escape(displayname)))  
        f.write("</ul>\n<hr>\n</body>\n</html>\n")  
        length = f.tell()  
        f.seek(0)  
        self.send_response(200)  
        self.send_header("Content-type", "text/html")  
        self.send_header("Content-Length", str(length))  
        self.end_headers()  
        return f  
    def translate_path(self, path):  
        """Translate a /-separated PATH to the local filename syntax. 
        Components that mean special things to the local file system 
        (e.g. drive or directory names) are ignored.  (XXX They should 
        probably be diagnosed.) 
        """  
        # abandon query parameters  
        path = path.split('?',1)[0]  
        path = path.split('#',1)[0]  
        path = posixpath.normpath(urllib.unquote(path))  
        words = path.split('/')  
        words = filter(None, words)  
        path = os.getcwd()  
        for word in words:  
            drive, word = os.path.splitdrive(word)  
            head, word = os.path.split(word)  
            if word in (os.curdir, os.pardir): continue  
            path = os.path.join(path, word)  
        return path  
    def copyfile(self, source, outputfile):  
        """Copy all data between two file objects. 
        The SOURCE argument is a file object open for reading 
        (or anything with a read() method) and the DESTINATION 
        argument is a file object open for writing (or 
        anything with a write() method). 
        The only reason for overriding this would be to change 
        the block size or perhaps to replace newlines by CRLF 
        -- note however that this the default server uses this 
        to copy binary data as well. 
        """  
        shutil.copyfileobj(source, outputfile)  
    def guess_type(self, path):  
        """Guess the type of a file. 
        Argument is a PATH (a filename). 
        Return value is a string of the form type/subtype, 
        usable for a MIME Content-type header. 
        The default implementation looks the file's extension 
        up in the table self.extensions_map, using application/octet-stream 
        as a default; however it would be permissible (if 
        slow) to look inside the data to make a better guess. 
        """  
        base, ext = posixpath.splitext(path)  
        if ext in self.extensions_map:  
            return self.extensions_map[ext]  
        ext = ext.lower()  
        if ext in self.extensions_map:  
            return self.extensions_map[ext]  
        else:  
            return self.extensions_map['']  
    if not mimetypes.inited:  
        mimetypes.init() # try to read system mime.types  
    extensions_map = mimetypes.types_map.copy()  
    extensions_map.update({  
        '': 'application/octet-stream', # Default  
        '.py': 'text/plain',  
        '.c': 'text/plain',  
        '.h': 'text/plain',  
        })  
def test(HandlerClass = SimpleHTTPRequestHandler,  
         ServerClass = BaseHTTPServer.HTTPServer):  
    BaseHTTPServer.test(HandlerClass, ServerClass)  
if __name__ == '__main__':  
    test()


tcpclient.h

#ifndef __TCP_CLIENT_H__
#define __TCP_CLIENT_H__
#include <netinet/in.h>
#include <sys/socket.h>
typedef struct _tcpclient{
    int socket;
    int remote_port;
    char remote_ip[16];
    struct sockaddr_in _addr;
    int connected;
} tcpclient;
int tcpclient_create(tcpclient *,const char *host, int port);
int tcpclient_conn(tcpclient *);
int tcpclient_recv(tcpclient *,char **lpbuff,int size);
int tcpclient_send(tcpclient *,char *buff,int size);
int tcpclient_close(tcpclient *);
#endif

tcpclient.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <string.h>
#include "tcpclient.h"
#define BUFFER_SIZE 1024
int tcpclient_create(tcpclient *pclient,const char *host, int port){
    struct hostent *he;
    if(pclient == NULL) return -1;
    memset(pclient,0,sizeof(tcpclient));
    if((he = gethostbyname(host))==NULL){
        return -2;
    }
    pclient->remote_port = port;
    strcpy(pclient->remote_ip,inet_ntoa( *((struct in_addr *)he->h_addr) ));
    pclient->_addr.sin_family = AF_INET;
    pclient->_addr.sin_port = htons(pclient->remote_port);
    pclient->_addr.sin_addr = *((struct in_addr *)he->h_addr);
    if((pclient->socket = socket(AF_INET,SOCK_STREAM,0))==-1){
        return -3;
    }
    /*TODO:是否应该释放内存呢?*/
    return 0;
}
int tcpclient_conn(tcpclient *pclient){
    if(pclient->connected)
        return 1;
    if(connect(pclient->socket, (struct sockaddr *)&pclient->_addr,sizeof(struct sockaddr))==-1){
        return -1;
    }
    pclient->connected = 1;
    return 0;
}
int tcpclient_recv(tcpclient *pclient,char **lpbuff,int size){
    int recvnum=0,tmpres=0;
    char buff[BUFFER_SIZE];
    *lpbuff = NULL;
    while(recvnum < size || size==0){
        tmpres = recv(pclient->socket, buff,BUFFER_SIZE,0);
        if(tmpres <= 0)
            break;
        recvnum += tmpres;
        if(*lpbuff == NULL){
            *lpbuff = (char*)malloc(recvnum);
            if(*lpbuff == NULL)
                return -2;
        }else{
            *lpbuff = (char*)realloc(*lpbuff,recvnum);
            if(*lpbuff == NULL)
                return -2;
        }
        memcpy(*lpbuff+recvnum-tmpres,buff,tmpres);
    }
    return recvnum;
}
int tcpclient_send(tcpclient *pclient,char *buff,int size){
    int sent=0,tmpres=0;
    while(sent < size){
        tmpres = send(pclient->socket,buff+sent,size-sent,0);
        if(tmpres == -1){
            return -1;
        }
        sent += tmpres;
    }
    return sent;
}
int tcpclient_close(tcpclient *pclient){
    close(pclient->socket);
    pclient->connected = 0;
    return 0;
}


httpost.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include "tcpclient.h"
int http_post_file(tcpclient *pclient, const char *page, const char *filepath,char **response){
  //check if the file is valid or not
  struct stat stat_buf;
  if(lstat(filepath,&stat_buf)<0){
  printf("lstat %s fail", filepath);
  return -1;
  }
  if(!S_ISREG(stat_buf.st_mode)){
  printf("%s is not a regular file!",filepath);
  return  -1;
  }
  char *filename;
  filename=strrchr(filepath,'/');
  if(filename==NULL){
  }
  filename+=1;
  if(filename>=filepath+strlen(filepath)){
  //'/' is the last character
  printf("%s is not a correct file!",filepath);
  return  -1;
  }
  printf("filepath=%s,filename=%s",filepath,filename);
  char content_type[4096];
  memset(content_type, 0, 4096);
  char post[512],host[256],content_len[256];
  char *lpbuf,*ptmp;
  int len=0;
  lpbuf = NULL;
  const char *header2="User-Agent: Is Http 1.1\r\nCache-Control: no-cache\r\nAccept: */*\r\n";
  sprintf(post,"POST %s HTTP/1.1\r\n",page);
  sprintf(host,"HOST: %s:%d\r\n",pclient->remote_ip,pclient->remote_port);
  strcpy(content_type,post);
  strcat(content_type,host);
  char *boundary = (char *)"-----------------------7d9ab1c50098";
  strcat(content_type, "Content-Type: multipart/form-data; boundary=");
  strcat(content_type, boundary);
  strcat(content_type, "\r\n");
  //--Construct request data {filePath, file}
  char content_before[8192];
  memset(content_before, 0, 8192);
  strcat(content_before, "--");
  strcat(content_before, boundary);
  strcat(content_before, "\r\n");
        /*
        //附加数据。
        char* message_json = "{\"password\":\"051784\",\"activated_time\":1544098669817,\"message_class\":1,\"phone_number\":\"15252450001\",\"message_id\":5}";
  strcat(content_before, "Content-Disposition: form-data; name=\"warning_message\"\r\n\r\n");
  strcat(content_before, message_json);
  strcat(content_before, "\r\n");
  strcat(content_before, "--");
  strcat(content_before, boundary);
  strcat(content_before, "\r\n");
        */
  strcat(content_before, "Content-Disposition: attachment; name=\"file\"; filename=\"");
  strcat(content_before, filename);
  strcat(content_before, "\"\r\n");
  strcat(content_before, "Content-Type: image/jpeg\r\n\r\n");
  char content_end[2048];
  memset(content_end, 0, 2048);
  strcat(content_end, "\r\n");
  strcat(content_end, "--");
  strcat(content_end, boundary);
  strcat(content_end, "--\r\n");
  int max_cont_len=5*1024*1024;
  char content[max_cont_len];
  int fd;
  fd=open(filepath,O_RDONLY,0666);
  if(!fd){
  printf("fail to open file : %s",filepath);
  return -1;
  }
  len=read(fd,content,max_cont_len);
  close(fd);
  char *lenstr;
  lenstr = (char*)malloc(256);
  sprintf(lenstr, "%d", (int)(strlen(content_before)+len+strlen(content_end)));
  strcat(content_type, "Content-Length: ");
  strcat(content_type, lenstr);
  strcat(content_type, "\r\n\r\n");
  //send
  if(!pclient->connected){
  tcpclient_conn(pclient);
  }
  //content-type
  tcpclient_send(pclient,content_type,strlen(content_type));
  //content-before
  tcpclient_send(pclient,content_before,strlen(content_before));
  //content
  tcpclient_send(pclient,content,len);
    //content-end
  tcpclient_send(pclient,content_end,strlen(content_end));
  /*it's time to recv from server*/
  if(tcpclient_recv(pclient,&lpbuf,0) <= 0){
  if(lpbuf) free(lpbuf);
  return -2;
  }
  printf("接收响应:\n%s",lpbuf);
     /*响应代码,|HTTP/1.0 200 OK|
      *从第10个字符开始,第3位
      * */
     memset(post,0,sizeof(post));
     strncpy(post,lpbuf+9,3);
     if(atoi(post)!=200){
         if(lpbuf) free(lpbuf);
         return atoi(post);
     }
     ptmp = (char*)strstr(lpbuf,"\r\n\r\n");
     if(ptmp == NULL){
         free(lpbuf);
         return -3;
     }
     ptmp += 4;/*跳过\r\n*/
     len = strlen(ptmp)+1;
     *response=(char*)malloc(len);
     if(*response == NULL){
         if(lpbuf) free(lpbuf);
         return -1;
     }
     memset(*response,0,len);
     memcpy(*response,ptmp,len-1);
     /*从头域找到内容长度,如果没有找到则不处理*/
     ptmp = (char*)strstr(lpbuf,"Content-Length:");
     if(ptmp != NULL){
         char *ptmp2;
         ptmp += 15;
         ptmp2 = (char*)strstr(ptmp,"\r\n");
         if(ptmp2 != NULL){
             memset(post,0,sizeof(post));
             strncpy(post,ptmp,ptmp2-ptmp);
             if(atoi(post)<len)
                 (*response)[atoi(post)] = '\0';
         }
     }
     if(lpbuf) free(lpbuf);
     return 0;
}
int http_post(tcpclient *pclient,char *page,char *request,char **response){
    char post[300],host[100],content_len[100];
    char *lpbuf,*ptmp;
    int len=0;
    lpbuf = NULL;
    const char *header2="User-Agent: Grandhonor Http 0.1\r\nCache-Control: no-cache\r\nContent-Type: application/x-www-form-urlencoded\r\nAccept: */*\r\n";
    sprintf(post,"POST %s HTTP/1.0\r\n",page);
    sprintf(host,"HOST: %s:%u\r\n", pclient->remote_ip, pclient->remote_port);
    sprintf(content_len,"Content-Length: %zu\r\n\r\n",strlen(request));
    len = strlen(post)+strlen(host)+strlen(header2)+strlen(content_len)+strlen(request)+1;
    lpbuf = (char*)malloc(len);
    if(lpbuf==NULL){
        return -1;
    }
    strcpy(lpbuf,post);
    strcat(lpbuf,host);
    strcat(lpbuf,header2);
    strcat(lpbuf,content_len);
    strcat(lpbuf,request);
    if(!pclient->connected){
        tcpclient_conn(pclient);
    }
    if(tcpclient_send(pclient,lpbuf,len)<0){
        return -1;
    }
    //printf("发送请求:\n%s",lpbuf);
    /*释放内存*/
    if(lpbuf != NULL) free(lpbuf);
    lpbuf = NULL;
    /*it's time to recv from server*/
    if(tcpclient_recv(pclient,&lpbuf,0) <= 0){
        if(lpbuf) free(lpbuf);
        return -2;
    }
    //printf("接收响应:\n%s",lpbuf);
    /*响应代码,|HTTP/1.0 200 OK|
     *从第10个字符开始,第3位
     * */
    memset(post,0,sizeof(post));
    strncpy(post,lpbuf+9,3);
    if(atoi(post)!=200){
        if(lpbuf) free(lpbuf);
        return atoi(post);
    }
    ptmp = (char*)strstr(lpbuf,"\r\n\r\n");
    if(ptmp == NULL){
        free(lpbuf);
        return -3;
    }
    ptmp += 4;/*跳过\r\n*/
    len = strlen(ptmp)+1;
    *response=(char*)malloc(len);
    if(*response == NULL){
        if(lpbuf) free(lpbuf);
        return -1;
    }
    memset(*response,0,len);
    memcpy(*response,ptmp,len-1);
    /*从头域找到内容长度,如果没有找到则不处理*/
    ptmp = (char*)strstr(lpbuf,"Content-Length:");
    if(ptmp != NULL){
        char *ptmp2;
        ptmp += 15;
        ptmp2 = (char*)strstr(ptmp,"\r\n");
        if(ptmp2 != NULL){
            memset(post,0,sizeof(post));
            strncpy(post,ptmp,ptmp2-ptmp);
            if(atoi(post)<len)
                (*response)[atoi(post)] = '\0';
        }
    }
    if(lpbuf) free(lpbuf);
    return 0;
}
int http_upload_file(const char* pHost, const int nPort, const char* pServerPath,
                     const char* pFile)
{
    tcpclient client;
    char *response = NULL;
    printf("开始组包%s", pFile);
    tcpclient_create(&client, pHost, nPort);
//    if(http_post(&client,"/recv_file.php","f1=hello",&response)){
//        printf("失败!");
//        exit(2);
//    }
    http_post_file(&client, pServerPath, pFile, &response);
    printf("responsed %zu:%s", strlen(response), response);
    free(response);
    return 0;
}
int main()
{
    http_upload_file("127.0.0.1", 8000, "/","/home/quantum6/index.html");
    return 0;
}


 

目录
相关文章
|
12天前
|
设计模式 数据库连接 PHP
PHP中的设计模式:如何提高代码的可维护性与扩展性在软件开发领域,PHP 是一种广泛使用的服务器端脚本语言。随着项目规模的扩大和复杂性的增加,保持代码的可维护性和可扩展性变得越来越重要。本文将探讨 PHP 中的设计模式,并通过实例展示如何应用这些模式来提高代码质量。
设计模式是经过验证的解决软件设计问题的方法。它们不是具体的代码,而是一种编码和设计经验的总结。在PHP开发中,合理地使用设计模式可以显著提高代码的可维护性、复用性和扩展性。本文将介绍几种常见的设计模式,包括单例模式、工厂模式和观察者模式,并通过具体的例子展示如何在PHP项目中应用这些模式。
|
14天前
|
机器学习/深度学习 JSON API
HTTP协议实战演练场:Python requests库助你成为网络数据抓取大师
在数据驱动的时代,网络数据抓取对于数据分析、机器学习等至关重要。HTTP协议作为互联网通信的基石,其重要性不言而喻。Python的`requests`库凭借简洁的API和强大的功能,成为网络数据抓取的利器。本文将通过实战演练展示如何使用`requests`库进行数据抓取,包括发送GET/POST请求、处理JSON响应及添加自定义请求头等。首先,请确保已安装`requests`库,可通过`pip install requests`进行安装。接下来,我们将逐一介绍如何利用`requests`库探索网络世界,助你成为数据抓取大师。在实践过程中,务必遵守相关法律法规和网站使用条款,做到技术与道德并重。
28 2
|
15天前
|
数据采集 存储 JSON
从零到一构建网络爬虫帝国:HTTP协议+Python requests库深度解析
在网络数据的海洋中,网络爬虫遵循HTTP协议,穿梭于互联网各处,收集宝贵信息。本文将从零开始,使用Python的requests库,深入解析HTTP协议,助你构建自己的网络爬虫帝国。首先介绍HTTP协议基础,包括请求与响应结构;然后详细介绍requests库的安装与使用,演示如何发送GET和POST请求并处理响应;最后概述爬虫构建流程及挑战,帮助你逐步掌握核心技术,畅游数据海洋。
47 3
|
21天前
|
数据采集 网络协议 API
HTTP协议大揭秘!Python requests库实战,让网络请求变得简单高效
【9月更文挑战第13天】在数字化时代,互联网成为信息传输的核心平台,HTTP协议作为基石,定义了客户端与服务器间的数据传输规则。直接处理HTTP请求复杂繁琐,但Python的`requests`库提供了一个简洁强大的接口,简化了这一过程。HTTP协议采用请求与响应模式,无状态且结构化设计,使其能灵活处理各种数据交换。
47 8
|
25天前
|
网络安全 开发工具 云计算
服务器看代码阿里云
随着云计算技术的发展,阿里云作为国内领先的云计算服务提供商,其服务器受到广大用户青睐。本文主要介绍如何在阿里云服务器上便捷地查看与管理代码,如使用SSH连接服务器并通过命令行工具打开文件,以及利用Git进行版本控制和协作开发,提高代码管理效率。无论个人开发者还是企业团队,都能借助阿里云服务器高效地部署与管理应用程序,提升工作效率及产品质量。
47 10
|
25天前
|
存储 Linux 网络安全
存放位置阿里云服务器代码的
阿里云服务器提供虚拟化计算、存储与网络服务。创建服务器时,可基于不同需求选择代码存放位置:文件系统支持直接通过SSH访问与编辑;公共目录如 `/var/www/html` 适合Web应用;对象存储OSS适用于大数据处理;代码托管服务如 GitLab 则利于版本控制与团队协作。合理选择有助于提升开发效率。
45 7
|
23天前
|
开发者
HTTP状态码是由网页服务器返回的三位数字响应代码,用于表示请求的处理结果和状态
HTTP状态码是由网页服务器返回的三位数字响应代码,用于表示请求的处理结果和状态
23 1
|
25天前
|
网络安全 云计算
阿里云服务器代码
阿里云作为中国领先的云计算服务提供商,为用户提供了丰富的云服务器实例。本文详细介绍如何在阿里云上定位服务器代码,包括利用控制台搜索实例并访问详细页面查找相关信息,使用`ssh`和`cat`等命令行工具远程连接及读取文件内容,以及在遇到困难时及时联系阿里云技术支持获取帮助的具体方法。无论您的实例类型与操作系统有何不同,总有一种方式能帮您顺利找到所需的服务器代码。
20 3
|
24天前
|
网络安全 云计算
在哪找出来阿里云服务器代码
本文介绍了在阿里云上查找服务器代码的方法,包括通过控制台搜索实例并进入详情页查找相关信息,利用 `ssh` 和 `cat` 等命令行工具远程访问和查看文件,以及联系阿里云技术支持获得进一步帮助,助您轻松定位和操作服务器代码。
26 1
|
15天前
|
Python
HTTP协议不再是迷!Python网络请求实战,带你走进网络世界的奥秘
本文介绍了HTTP协议,它是互联网信息传递的核心。作为客户端与服务器通信的基础,HTTP请求包括请求行、头和体三部分。通过Python的`requests`库,我们可以轻松实现HTTP请求。本文将指导你安装`requests`库,并通过实战示例演示如何发送GET和POST请求。无论你是想获取网页内容还是提交表单数据,都能通过简单的代码实现。希望本文能帮助你在Python网络请求的道路上迈出坚实的一步。
33 0
下一篇
无影云桌面