2010-06-07 3 views
3

나는 파일 경로가 아닌 문자열 데이터를 사용하여 첨부 파일을 추가 할 수있는 메서드를 추가하여 Worx에서 PHP 메일러 클래스를 확장하려고합니다.php : // 메모리 래퍼를 사용하면 오류가 발생합니다.

public function addAttachmentString($string, $name='', $encoding = 'base64', $type = 'application/octet-stream') 
{ 
    $path = 'php://memory/' . md5(microtime()); 
    $file = fopen($path, 'w'); 
    fwrite($file, $string); 
    fclose($file); 

    $this->AddAttachment($path, $name, $encoding, $type); 
} 

그러나, 나는 얻을 모두가 PHP 경고입니다 :

나는 이런 식으로 뭔가 해낸 원래의 문서와되지 않은 괜찮은 예제가 있습니다

PHP Warning: fopen() [<a href='function.fopen'>function.fopen</a>]: Invalid php:// URL specified 

는하지만 인터넷 (one here on SO 포함) 주변에서 한 쌍을 찾았습니다. 내 용도가 맞습니다.

누구나 사용에 성공 했습니까?

내 대안은 임시 파일을 만들고 정리하는 것입니다.하지만 이는 디스크에 쓸 필요가 있음을 의미하며이 기능은 대량 배치 프로세스의 일부로 사용되며 느린 디스크 작업 (예 : 이전 서버) 가능한 곳. 이 파일은 짧은 파일이지만 스크립트 이메일을받는 사람마다 다른 정보를 가지고 있습니다.

+0

나는 이것에 늦었지만 fclose()에서 메모리 버퍼를 삭제하지 않겠습니까? –

답변

1

신속하게 http://php.net/manual/en/wrappers.php.php과 소스 코드를 보면 "/ '. md5 (microtime());"에 대한 지원이 표시되지 않습니다. " 비트.

샘플 코드 :

<?php 
print "Trying with md5\n"; 
$path = 'php://memory/' . md5(microtime()); 
$file = fopen($path, 'w'); 
if ($file) 
{ 
    fwrite($file, "blah"); 
    fclose($file); 
} 
print "done - with md5\n"; 

print "Trying without md5\n"; 
$path = 'php://memory'; 
$file = fopen($path, 'w'); 
if ($file) 
{ 
    fwrite($file, "blah"); 
    fclose($file); 
} 
print "done - no md5\n"; 

출력 :

buzzbee ~$ php test.php 
Trying with md5 

Warning: fopen(): Invalid php:// URL specified in test.php on line 4 

Warning: fopen(php://memory/d2a0eef34dff2b8cc40bca14a761a8eb): failed to open stream: operation failed in test.php on line 4 
done - with md5 
Trying without md5 
done - no md5 
+0

흠 ... 그래, 나도 이걸 시도해 봤어. 내가 가진 한 가지 문제는 내가 콘텐츠를 첨부하지 않았다는 것이다. Phpmailer가이 방법을 잘못 사용하고 있기 때문일 수 있습니다 ...방금 phpmailer에 AddStringAttachment 메소드가 있다는 것을 깨달았습니다. (즉각적인 문제를 해결합니다.) 그러나 php : // 메모리 래퍼에 대해 배울 수 있습니다. – HorusKol

+0

$ path = 'php : // memory /'. md5 (마이크로 시간()); 모든 것을 망가 뜨리고 $ path = 'php : // memory'; – Jaro

15

그냥 php://memory입니다. 예를 들어,

<?php 
    $path = 'php://memory'; 
    $h = fopen($path, "rw+"); 
    fwrite($h, "bugabuga"); 
    fseek($h, 0); 
    echo stream_get_contents($h); 

은 "bugabuga"를 생성합니다.

1

여기에 단순히 is the type and the syntax 문제 :

php://memoryphp://temp읽기 - 쓰기가 임시 데이터를 허용 스트림입니다 저장한다 은 파일 형식 래퍼입니다. 두 가지의 유일한 차이점은 php://memory은 항상 데이터를 메모리에 저장하는 반면, php://temp은 저장된 데이터 양이 미리 정의 된 한도 (기본값은 2MB)에 도달하면 임시 파일을 사용한다는 것입니다. 이 임시 파일의 위치는 sys_get_temp_dir() 기능과 동일한 방식으로 결정됩니다. 한마디로

, 당신이 원하는 유형 대신 temp하고 원하는 구문은 다음과 같습니다

php://temp/maxmemory:$limit 

$limit 바이트입니다. safe byte functions을 사용하여 계산하려고합니다.

+0

그래서 fopen ('php : // temp/maxmemory : 1048576', 'w')과 같은 것을 사용한다면, 내 'filepath'는 어떻게 될 것입니까? 전체 " 'php : // temp/maxmemory : 1048576'"? 다른 함수에서 사용하려면이 파일 경로가 필요합니다. 감사합니다. – Andrew

+0

@Andrew'sys_get_temp_dir()'을 확인하십시오. 또는 더 나은 방법 : 새로운 질문을 열고,이 질문을 참조하고 대답하십시오. – kaiser

관련 문제