2012-08-10 9 views
1

나는 Coldfusion8을 사용하고 내가 같이하고있어 원격 서버에서 이미지를 가져 오기 위해 필요 해요 :ColdFusion에서 CFHTTP로 가져온 파일의 임시 경로를 가져 오는 방법은 무엇입니까?

<cfhttp timeout="45" throwonerror="no" url="#variables.testFilePath#" method="get" useragent="Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.12) Gecko/20080201 Firefox/2.0.0.12" getasbinary="yes" result="variables.objGet"> 
<cfset variables.objImage = ImageNew(variables.objGet.FileContent)> 
지금은 아마존 S3에 이미지를 저장해야하지만 함수는 내가 사용하려는

:

<cfset result = s3.putObject(url.b,file.serverFile,file.contentType,'300',form.cacheControl,'30',form.acl,form.storageClass,form.keyName,GetTempDirectory())> 

내 생성 된 이미지에서 찾을 수 있습니다 디렉토리를 필요

는 질문

:.
는 방법이 있나요 cfhttp으로 당겨지고 imageNew을 사용하여 이미지로 변환 된 이미지 파일의 디렉토리를 가져 오려면? 또는 먼저 디스크에 파일을 저장해야합니까? 저장하기 전에 크기를 조정해야하므로 먼저 디스크에 저장하지 않고 얻을 수 없을 수도 있습니다.

포인터 주셔서 감사합니다!

편집 :

<!--- getAsBinary ---> 
<cfhttp timeout="45" 
    throwonerror="no" 
    url="#variables.testFilePath#" 
    method="get" 
    useragent="..."   
    getasbinary="yes" 
    result="objGet"> 

<!--- validate ---> 
<cfif len(variables.testFilePath) EQ 0> 
    <cfset variables.errorCount = variables.errorCount+1> 
    <cfset variables.failedLoads = "FILE NOT FOUND" > 
<cfelse> 
    <cfif len(objGet.Filecontent) EQ 0> 
     <cfset variables.errorCount = variables.errorCount+1> 
     <cfset variables.failedLoads = "COULD NOT LOAD IMAGE"> 
    <cfelseif NOT listfindnocase(variables.allow, variables.fileExt) > 
     <cfset variables.errorCount = variables.errorCount+1> 
     <cfset variables.failedLoads = "WRONG FILE TYPE"> 
    <cfelse> 
     <cftry> 
      <cfscript> 
       objImage = ImageNew(objGet.FileContent); 
       ImageSetAntialiasing(objImage,"on"); 
       <!--- resize/crop ---> 
       variables.keyName = Session.loginid & "_S_"; 
      </cfscript> 
      <!--- convert modified image back to binary ---> 
      <cfset variables.filekey = toBase64(objImage)> 
      <!--- pass to s3.cfc ---> 
      <cfset result = s3.putObject(variables.bucketName, variables.filekey, variables.contentType, variables.httptimeout, variables.cacheControl, variables.cacheDays, variables.acl, variables.storageClass, variables.keyName, variables.imageSrc, "true")> 
      <cfcatch> 
       <cfset variables.errorCount = variables.errorCount+1> 
       <cfset variables.failedLoads = "NO IMAGE"> 
      </cfcatch> 
     </cftry> 
    </cfif> 

내가 진에 자른 이미지를 다시 변환 할 필요는 s3.putobject 달리 구성하려고 노력하는 또 다른 cffile action="readBinary"과 휴식을 할 것이기 때문에 :
나는이 같은 작업 있어요

<cffile action="readBinary" file="#arguments.uploadDir##arguments.fileKey#" variable="binaryFileData"> 

이 012를 사용하여 임시 파일 경로를 얻을 수있는 반면 (이미지는 여전히 임시)이고 uploadDir으로 설정하면 CF docs 경로는 드라이브 문자 또는 슬래시로 시작하는 절대 경로 여야하며 그렇지 않으면 www-root 임시 디렉토리가 사용되기 때문에 도움이되지 않습니다.

필자의 경우 임시 www-root 디렉토리는 C:/이고 임시 파일 CFFile-Servlet은 E:/이고 상대 경로는 작동하지 않습니다 (파일을 찾을 수 없음). 그래서 s3.cfc에서 이미지를 다시 읽을 방법이 없으므로 S3.cfc를 호출하기 전에 바이너리로 다시 변환합니다. s3.cfc에게 이미 이진 이미지를 보내고 있고 다시 읽을 필요가 없다는 또 다른 매개 변수 (1/0)를 전달합니다. 그래서 같이

는 :

<!--- if encoded is true, filekey already is the encoded image ---> 
<cfif arguments.encoded EQ "true"> 
    <!--- already sending binary image ---> 
    <cfset binaryFileData = arguments.fileKey> 
<cfelse> 
    <!--- Default ---> 
    <cffile action="readBinary" file="#arguments.uploadDir##arguments.fileKey#" variable="binaryFileData"> 
</cfif> 

나는 이것이 가장 현명한 방법 성능 현명 있는지 확실하지 않습니다, 그러나 아주 부드럽게 작동하는 것 같다. 의견 환영합니다!

답변

2

pathfile 속성 대신 result을 사용할 수 있습니다. GetTempDirectory() + CreateUUID()을 사용하여 임시 경로를 생성하고 가져 와서 삭제하십시오. 또한 변수에 내용을 가져온 다음 중간 파일에 쓰는 것이 메모리 효율이 약간 더 좋을 수도 있습니다.

+0

확인. 이걸 시험해 봐. 나는 내가 어떻게 사는지 재판 할 것이다. 지금까지 감사합니다 – frequent

+0

한 가지 질문 : [this] (http://www.bennadel.com/blog/1890-Getting-The-Image-SRC-Of-ColdFusion-s-CFImage-WriteToBrowser-Temporary-Image-With- CFXML.htm) 효율적인 방법이 될까요? 이미지를 정리하지 않고 정리할 필요가 없습니다. – frequent

+0

죄송합니다. 저는이 접근법이 귀하의 경우에 어떻게 사용될 수 있는지 모르겠습니다 ... 기본적으로 파일을 다운로드하여 다른 곳으로 업로드해야합니다. 더 효율적인 솔루션은'rsync' (Unix)와 같은 것을 사용할 수 있습니다. Railo를 사용하는 경우 맵핑으로 S3 버킷을 마운트하고 바로 파일을 저장할 수 있습니다. 비록 this'd가 일하는 지 명확히하지 않고있다. – Sergii

1

Cfhttp 결과는 데이터를 메모리 변수에 저장합니다. ImageNew는 메모리에 상주하는 'ColdFusion'이미지도 만듭니다. cfhttp 또는 imagewrite 등에서 보내려면 실제 파일로 저장해야합니다.

실제 파일에 저장하지 않고 cffile action = "writetobrowser"를 사용하여 브라우저에 보내면되지만 브라우저가 액세스 할 수있는 임시 위치에 저장되지만 그다지 좋지는 않습니다. 나는 생각하지 않는다.

http://livedocs.adobe.com/coldfusion/8/htmldocs/functions_h-im_34.html http://livedocs.adobe.com/coldfusion/8/htmldocs/Images_19.html

+0

링크를 이용해 주셔서 감사합니다. – frequent

0

AmazonS3Client 당신이이 InputStream과 패스에서 이진 데이터를 포장 할 수 있도록 InputStream를 소요 putObject method있다 백업 파일에 대한 걱정없이. 이 같은

뭔가 :

<cfhttp method="get" url="#local.url#" result="local.httpResult" getAsBinary="true"/> 
<cfif local.httpResult.statusCode eq "200 OK"> 
    <cfset var fileInputStream = createObject("java", "java.io.ByteArrayInputStream").init(local.httpResult.fileContent) /> 
    <cfset var objectMetadata = createObject("java", "com.amazonaws.services.s3.model.ObjectMetadata").init() /> 
    <cfset application.S3UTIL.s3Client.putObject("some.bucket", "folder/file.ext", local.fileInputStream, local.objectMetadata)/> 
</cfif> 
관련 문제