本文目录导读:

我来详细说明如何在PHP中使用IPFS。
安装IPFS环境
首先需要在服务器上安装IPFS:
# 下载IPFS wget https://dist.ipfs.io/go-ipfs/v0.12.0/go-ipfs_v0.12.0_linux-amd64.tar.gz # 解压 tar -xvzf go-ipfs_v0.12.0_linux-amd64.tar.gz # 移动到系统路径 cd go-ipfs sudo mv ipfs /usr/local/bin/ # 初始化IPFS ipfs init
使用PHP执行IPFS命令
exec()函数直接调用
<?php
class IPFS {
private $apiUrl;
private $ipfsPath;
public function __construct($apiUrl = 'http://localhost:5001/api/v0/', $ipfsPath = '/usr/local/bin/ipfs') {
$this->apiUrl = $apiUrl;
$this->ipfsPath = $ipfsPath;
}
// 添加文件到IPFS
public function addFile($filePath) {
$command = "{$this->ipfsPath} add " . escapeshellarg($filePath);
$output = shell_exec($command);
// 解析输出获取Hash
preg_match('/added\s+(\w+)\s+/', $output, $matches);
return isset($matches[1]) ? $matches[1] : null;
}
// 添加字符串内容到IPFS
public function addContent($content) {
$tempFile = tempnam(sys_get_temp_dir(), 'ipfs_');
file_put_contents($tempFile, $content);
$hash = $this->addFile($tempFile);
unlink($tempFile);
return $hash;
}
// 从IPFS获取文件
public function getFile($hash, $outputPath = null) {
if ($outputPath) {
$command = "{$this->ipfsPath} get " . escapeshellarg($hash) . " -o " . escapeshellarg($outputPath);
} else {
$command = "{$this->ipfsPath} cat " . escapeshellarg($hash);
}
return shell_exec($command);
}
// 获取IPFS对象信息
public function getInfo($hash) {
$command = "{$this->ipfsPath} object stat " . escapeshellarg($hash);
return shell_exec($command);
}
// 发布到IPNS
public function publish($hash) {
$command = "{$this->ipfsPath} name publish " . escapeshellarg($hash);
return shell_exec($command);
}
}
// 使用示例
$ipfs = new IPFS();
// 添加文件
$hash = $ipfs->addFile('/path/to/your/file.txt');
echo "File Hash: " . $hash . "\n";
// 添加字符串内容
$hash = $ipfs->addContent("Hello, IPFS!");
echo "Content Hash: " . $hash . "\n";
// 获取文件内容
$content = $ipfs->getFile($hash);
echo "Content: " . $content . "\n";
?>
使用HTTP API
<?php
class IPFSAPI {
private $apiUrl;
public function __construct($apiUrl = 'http://localhost:5001/api/v0/') {
$this->apiUrl = $apiUrl;
}
// 添加文件
public function add($filePath) {
$url = $this->apiUrl . 'add';
if (class_exists('CURLFile')) {
$postData = ['file' => new CURLFile($filePath)];
} else {
$postData = ['file' => '@' . $filePath];
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
return $result['Hash'] ?? null;
}
// 获取文件内容
public function cat($hash) {
$url = $this->apiUrl . 'cat?arg=' . urlencode($hash);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
return $response;
}
// 上传文件内容
public function putContent($content, $fileName = 'file.txt') {
$url = $this->apiUrl . 'add?pin=true';
$boundary = md5(time());
$eol = "\r\n";
$data = '';
$data .= '--' . $boundary . $eol;
$data .= 'Content-Disposition: form-data; name="file"; filename="' . $fileName . '"' . $eol;
$data .= 'Content-Type: text/plain' . $eol . $eol;
$data .= $content . $eol;
$data .= '--' . $boundary . '--' . $eol;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: multipart/form-data; boundary=' . $boundary,
'Content-Length: ' . strlen($data)
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
return $result['Hash'] ?? null;
}
// 管理固定文件
public function pinAdd($hash) {
$url = $this->apiUrl . 'pin/add?arg=' . urlencode($hash);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
return json_decode($response, true);
}
// 获取节点信息
public function id() {
$url = $this->apiUrl . 'id';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
return json_decode($response, true);
}
}
// 使用示例
$ipfs = new IPFSAPI();
// 添加文件
$hash = $ipfs->add('/path/to/file.txt');
echo "File hash: " . $hash . "\n";
$hash = $ipfs->putContent("Hello World!", "hello.txt");
echo "Content hash: " . $hash . "\n";
$content = $ipfs->cat($hash);
echo "Content: " . $content . "\n";
// 获取节点信息
$nodeInfo = $ipfs->id();
print_r($nodeInfo);
?>
使用Composer包
// 安装依赖
// composer require cloutier/php-ipfs-api
<?php
require_once 'vendor/autoload.php';
use Cloutier\PhpIpfsApi\IPFS;
class IPFSManager {
private $ipfs;
public function __construct($host = 'localhost', $port = 5001) {
$this->ipfs = new IPFS($host, $port);
}
// 添加文件
public function addFile($filePath) {
return $this->ipfs->addFile($filePath);
}
// 添加目录
public function addDirectory($dirPath) {
return $this->ipfs->addDir($dirPath);
}
// 获取文件
public function getFile($hash) {
return $this->ipfs->cat($hash);
}
// 获取文件到本地
public function getFileToLocal($hash, $outputPath) {
$content = $this->ipfs->cat($hash);
file_put_contents($outputPath, $content);
return true;
}
// 列目录
public function ls($hash) {
return $this->ipfs->ls($hash);
}
// Pin文件
public function pinFile($hash) {
return $this->ipfs->pinAdd($hash);
}
// 上传文件(表单上传)
public function uploadFile($sourcePath) {
$hash = $this->addFile($sourcePath);
$this->pinFile($hash);
return $hash;
}
}
// 使用示例
$manager = new IPFSManager();
// 上传文件
$hash = $manager->uploadFile('document.pdf');
echo "IPFS Hash: " . $hash . "\n";
// 获取文件
$content = $manager->getFile($hash);
file_put_contents('downloaded_document.pdf', $content);
echo "File downloaded successfully\n";
?>
完整示例:文件上传和下载
<?php
// index.php - 完整的IPFS文件管理系统
class IPFSFileManager {
private $ipfs;
public function __construct() {
// 使用HTTP API
$this->ipfs = new IPFSAPI();
}
// 上传文件
public function upload($file) {
if (!isset($file['tmp_name']) || $file['error'] !== UPLOAD_ERR_OK) {
throw new Exception('File upload failed');
}
// 上传到IPFS
$hash = $this->ipfs->add($file['tmp_name']);
// 固定文件
$this->ipfs->pinAdd($hash);
// 保存文件信息到数据库
$this->saveFileInfo($hash, $file['name'], $file['size']);
return $hash;
}
// 下载文件
public function download($hash) {
$content = $this->ipfs->cat($hash);
// 获取文件信息
$fileInfo = $this->getFileInfo($hash);
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . ($fileInfo['name'] ?? 'download') . '"');
header('Content-Length: ' . strlen($content));
echo $content;
exit;
}
private function saveFileInfo($hash, $name, $size) {
// 数据库保存逻辑
// 这里用文件存储示例
$files = [];
if (file_exists('files.json')) {
$files = json_decode(file_get_contents('files.json'), true);
}
$files[$hash] = [
'name' => $name,
'size' => $size,
'time' => time()
];
file_put_contents('files.json', json_encode($files));
}
private function getFileInfo($hash) {
if (file_exists('files.json')) {
$files = json_decode(file_get_contents('files.json'), true);
return $files[$hash] ?? null;
}
return null;
}
}
// 处理请求
$manager = new IPFSFileManager();
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['file'])) {
try {
$hash = $manager->upload($_FILES['file']);
echo json_encode(['success' => true, 'hash' => $hash]);
} catch (Exception $e) {
echo json_encode(['success' => false, 'error' => $e->getMessage()]);
}
} elseif (isset($_GET['download'])) {
$hash = $_GET['download'];
$manager->download($hash);
} else {
// 显示上传表单
?>
<!DOCTYPE html>
<html>
<head>
<title>IPFS File Manager</title>
</head>
<body>
<h1>Upload to IPFS</h1>
<form method="post" enctype="multipart/form-data">
<input type="file" name="file" required>
<button type="submit">Upload</button>
</form>
</body>
</html>
<?php
}
?>
注意事项
- 安全性:使用
escapeshellarg()防止命令注入 - 权限:确保Web服务器有执行IPFS命令的权限
- 性能:大文件建议使用流式处理
- 错误处理:始终检查命令执行结果
- 配置:确保IPFS守护进程正在运行:
ipfs daemon &
选择哪种方式取决于你的具体需求:
- exec()方式:简单直接,适合小项目
- HTTP API方式:推荐方式,更安全可靠
- Composer包:功能完整,适合大型项目
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播