내 고객은 기업가이며 html 지식이 없습니다. 그는 리눅스 공유 호스팅 환경 (기본 패키지)에서 PHP로 만든 웹 사이트를 가지고 있습니다. 그의 사이트에서 그는 사진과 함께 이전 작업을 보여주고 싶습니다. 그러나 그는 관리자로 로그인하고 그 사진을 직접 업로드하는 것이 어렵다고 불평합니다.
-이제 그는 자신의 Dropbox 계정에있는 사진을 자신의 사이트에 업로드 할 수 있도록 쉬운 것을 작성해달라고합니다. 나는 OK라고 말했다 :)
관리자 페이지를 만들었습니다 (여기에서 제 고객은 자신의 사이트에 다운로드 할 보관 용 앨범을 선택할 수 있습니다.)-PHP 용 보관 용 API를 사용하여 사진 앨범을 찾았습니다. -POST-request (parameter = dropbox account의 파일 경로)를 수행 할 제출 버튼으로 앨범을 나열하는 양식을 만들었습니다.
해당 요청에 대한 코드는 다음과 같습니다.
if (isset($_POST['AlbumAdd'])) {
$name = $_POST['AlbumAdd'];
//echo "submitted: $name <br>";
$entry = getClient()->getMetadataWithChildren($name); //dropbox-sdk
if ($entry['is_dir']) {
//for now create file on localhost -> replace with ftp to upload on shared hosting site
if (!file_exists(__DIR__ . "/../examples/folder" . $name)) { //if !excists create folder on localhost
mkdir(__DIR__ . "/../examples/folder" . $name, 0777, true);
//echo "created " . $name . "on localhost";
}
foreach ($entry['contents'] as $child) {
$cp = $child['path'];
$size = $child['size'];
$cn = basename($cp);
echo "basename (cn)= " . $cn . " [$size] <br>";
if (!$child['is_dir']) //files only
{
//download from dropbox to localhost
getClient()->getFile($cp, fopen(__DIR__ . '/../examples/folder' . $cp, 'w+b'));
}
}
}
}
작은 파일에서는 잘 작동하지만 앨범이 너무 크면 다음 예외가 발생합니다.
Fatal error: Maximum execution time of 30 seconds exceeded in C:\wamp\www\dropbox-sdk-php-1.1.4\dropbox-sdk\Dropbox\CurlStreamRelay.php on line 26
TEST OUTPUT:
basename (cn)= 01.mp3 [8.1 MB]
basename (cn)= 02.mp3 [7.3 MB]
basename (cn)= 03.mp3 [6 MB]
지금 가장 좋은 것은 무엇입니까 ?? -호스팅 사이트의 헬프 데스크에서 최대 실행 시간 설정을 변경할 수 없다고합니다. 따라서 내 php.ini 파일을 변경할 필요가 없습니다.
-각 사진을 개별적으로 업로드 하시겠습니까?
-전용 서버로 전환하면 내가 모든 권한을 갖게 되나요? 내 고객이 매월 125 유로를 추가로 지불하는 것을 좋아하는지 모르겠습니다.
클라이언트 측 로직을 사용하여 로직을 리팩터링해야한다고 생각
합니다. 먼저 원격 폴더의 구조 (getMetadataWithChildren () 사용)를 다운로드하고 일종의 인덱싱 (예 : 각 파일 할당)을 사용하여 디스크에 저장해야합니다. / dir은 고유 한 ID를 다운로드합니다). 이 작업은 공급자가 설정 한 최대 실행 시간 제한 내에 종료되어야합니다.
그런 다음 두 번째 스크립트를 작성하여 실제 데이터를 다운로드하고 이전에 다운로드 한 색인을 한 번에 하나씩 읽어야합니다.
스크립트는 "MAXIMUM EXECUTION TIME"오류를 포착하여 아직 작업이 완료되지 않았 음을 알려야합니다. 다음과 같이됩니다.
파일 : "download_data_from_dropbox.php"
<?php
register_shutdown_function('shutdown');
global $id;
DOWNLOAD_DATA($id);
echo json_encode(array("done" => 1);
exit 0;
function shutdown() {
$e = error_get_last();
if ($e == "max_execution_time") {
echo json_encode(array("lastId" => $id);
exit 0;
}
}
?>
그런 다음 php 스크립트를 호출하여 완료 될 때까지 Dropbox에서 데이터를 반복적으로 다운로드해야합니다.
파일 "index.html":
<html>
<head>
</head>
<body>
...
<div id="status"></div>
...
<script>
$(document).ready(function() {
var done = false, id = '',
while (!done) {
var url = "download_data_from_dropbox.php?id=" + id;
$.ajax({
url: url,
dataType: 'json',
}).done(function(response) {
if (response.done === 1) {
// php script is done
done = true;
}
$("#status").html("Downloading data, last file ID is " + response.lastId + " ...");
}).fail(function(jqXHR, textStatus) {
$("#mybox").html("Error while downloading data: " textStatus);
done = true;
});
}
});
</script>
</body>
</html>
참고 :이 코드는 가능한 솔루션을 보여주기위한 간단한 시도이며, 의사 코드가 포함되어 있으며, 전혀 완료되지 않았으며, 물론 테스트되지도 않았습니다 ... :-) javascript setInterval()
에서 while (!done)
루프 대신을 사용해야합니다 . 암호...
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다