def make_request(self, method, bucket, key, path_args, headers, s3_object): calling_format = Utils.get_callingformat_for_bucket(self.calling_format, bucket) if self.is_secure and not isinstance(calling_format, PathFormat) and bucket.find( "." ) != -1: raise Exception("You are making an SSL connection, however, the bucket contains periods and \ the wildcard certificate will not match by default. Please consider using HTTP.") path = calling_format.get_url(self.is_secure, self.server, self.port, bucket, key, path_args) connect_server = calling_format.get_server(self.server, bucket) if s3_object: head = self.add_metadata_headers(self.add_headers(headers, ""), s3_object.metadata) else: head = self.add_headers(headers, "") headerconfig = self.add_auth_headers(head, method, bucket, key, path_args) if s3_object: if s3_object.file_path: headerconfig["Content-Length"] = str(os.path.getsize(Utils.decode_utf(s3_object.file_path))) #需要手动将content-length添加到头信息中 else: headerconfig["Content-Length"] = str(0) return self.send_request(connect_server, method, path, headerconfig)
def create_object(self, bucket, key, s3_object, headers = None): conn = self.make_request("PUT", bucket, Utils.urlencode(key), None, headers, s3_object) CHUNKSIZE = 65563 if s3_object.file_path: with open(Utils.decode_utf(s3_object.file_path), 'rb') as f: while True: chunk = f.read(CHUNKSIZE) if not chunk: break conn.send(chunk) return conn.getresponse()