0

2 つの機能があります。1 つはチャンク アップロードを使用し、もう 1 つはファイル全体をアップロードします。

public function chunkedUpload($file, $filename = false, $path = '', $overwrite = true)
{
    if (file_exists($file)) {
        if ($handle = @fopen($file, 'r')) {
            // Set initial upload ID and offset
            $uploadID = null;
            $offset = 0;

            // Read from the file handle until End OF File, uploading each chunk
            while ($data = fread($handle, $this->chunkSize)) {
                $chunkHandle = fopen('php://temp', 'rw');
                fwrite($chunkHandle, $data);
                $this->OAuth->setInFile($chunkHandle);

                // On subsequent chunks, use the upload ID returned by the previous request
                if (isset($response['body']->upload_id)) {
                    $uploadID = $response['body']->upload_id;
                }

                $params = array('upload_id' => $uploadID, 'offset' => $offset);
                $response = $this->fetch('PUT', self::CONTENT_URL, 'chunked_upload', $params);
                $offset += mb_strlen($data, '8bit');
                fclose($chunkHandle);
            }

            // Complete the chunked upload
            $filename = (is_string($filename)) ? $filename : basename($file);
            $call = 'commit_chunked_upload/' . $this->root . '/' . $this->encodePath($path . $filename);
            $params = array('overwrite' => (int) $overwrite, 'upload_id' => $uploadID);
            $response = $this->fetch('POST', self::CONTENT_URL, $call, $params);
            return $response;
        } else {
            throw new Exception('Could not open ' . $file . ' for reading');
        }
    }

    // Throw an Exception if the file does not exist
    throw new Exception('Local file ' . $file . ' does not exist');
}




        public function putFile($file, $filename = false, $path = '', $overwrite = true)
{
    if (file_exists($file)) {
        if (filesize($file) <= 157286400) {
            $filename = (is_string($filename)) ? $filename : basename($file);
            $call = 'files/' . $this->root . '/' . $this->encodePath($path . $filename);
            // If no filename is provided we'll use the original filename

            $params = array(
                'filename' => $filename,
                'file' => '@' . str_replace('\\', '\\', $file) . ';filename=' . $filename,
                'overwrite' => (int) $overwrite,
            );
            $response = $this->fetch('POST', self::CONTENT_URL, $call, $params);
            return $response;
        }
        throw new Exception('File exceeds 150MB upload limit');
    }

    // Throw an Exception if the file does not exist
    throw new Exception('Local file ' . $file . ' does not exist');
}

これらの機能を同じサーバー ディレクトリからテストしたところ、どちらも正常に動作しました。ただし、chunkedUploadリモートの http:// および ftp:// URL からアップロードすることはできますがputFile、できません。なぜこれが起こるのですか?これら 2 つの機能に問題があり、これを引き起こす可能性がありますか?

4

1 に答える 1

1

これは、file_exists がリモート サーバーで機能しないためです。

PHP 5 の file_exists() は、ローカル パス名のみの URL を受け入れません

代わりに curl を使用して head リクエストを送信します

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'your url');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_exec($ch);
$size = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD);
var_dump($size);
于 2012-08-09T02:06:51.730 に答える