2017-04-21 2 views
0

Ich bin ziemlich neu in ColdFusion. Ich habe den folgenden Code, der die Bilder auf der Seite anzeigt, die ich in einem Tutorial referenziere, das gut funktioniert.Bild von Website mit Coldfusion herunterladen

Wenn der Benutzer eines der Bilder auswählt, wird das Bild im Browser angezeigt. Allerdings möchte ich dem Benutzer erlauben, die Bilder herunterzuladen, anstatt sie im Browser anzuzeigen.

Ich kann nicht die HTML5 herunterladen zu erreichen, was ich tue, aufgrund der Tatsache, dass die Website, die ich arbeite auf XHTML 1.0 läuft.

Ich fand den folgenden Ansatz File Downloads with ColdFusion, aber ich verstehe nicht, wie man es anwendet. Wenn mich jemand in die richtige Richtung führen oder mir einen anderen Ansatz zeigen könnte, würde ich es begrüßen.

Vielen Dank im Voraus.

<cfset filters = "*.pdf|*.zip|*.doc*|*.docx*|.ppt*|*.pps*|*.pot*|*.dot*|*.xls*|*.xlsx*|*.swf|*.rtf|*.png|*.bmp|*.jpeg|*.gif"> 
<cfdirectory 
    directory="c:\Downloads\Logos" 
    name="myDirectory" 
    action = "list" 
    filter="#filters#" 
    sort="name ASC, size DESC" 
    > 
<table width="80%" border="0" align="left"> 
    <cfoutput query="myDirectory"> 
     <cfset FileExt=ListLast(Name,".")> 
     <cfif FileExt eq 'pdf'> 
      <cfset imgicon = 'pdf-icon-24.png'> 
      <cfelseif FileExt eq 'xlsx' or FileExt eq 'xls'> 
      <cfset imgicon = 'Microsoft-Excel-icon-24.png'> 
      <cfelseif FileExt eq 'docx' or FileExt eq 'doc'> 
      <cfset imgicon = 'docx-icon-24.png'> 
      <cfelseif FileExt eq 'lnk'> 
      <cfset imgicon = 'url-icon-24.png'> 
      <cfelseif FileExt eq 'png'> 
      <cfset imgicon = 'png-icon.png'> 
      <cfelse> 
      <cfset imgicon = 'Documents-icon-24.png'> 
     </cfif> 
     <tr> 
      <td width="30">&nbsp;</td> 
      <td class="e"><img src="images/#imgicon#" alt="#Name#" class="float-left"/ ></td> 
      <td class="e"> <a href="ForceDownload.cfm?filename=#EncodeForURL(Name)#">#Name#</a></td> 
     </tr> 
    </cfoutput> 
</table> 
</p> 
<br /><br /><br /><br /><br /> <br /><br /><br /><br /><br /> <br /><br /><br /><br /><br /> <br /><br /><br /><br /><br /> <br /><br /><br /><br /><br /> <br /><br /><br /><br /><br /> <br /><br /><br /><br /><br /> <br /><br /><br /><br /><br />  
<p class="post-footer align-left"> 
    <span class="date"> 
     <cfoutput>#dateformat(Now(),"mmm dd,yyyy")#</cfoutput> 
    </span> 
</p> 
<br /> 
<br />  
</div> 

aktualisieren habe ich ein anderes Skript und es ForceDownload.cfm genannt und hat die folgenden:

<cfset folder = "c:\path\Downloads\Logos\"> 
<cfif StructKeyExists(url,"filename") && fileExists(folder & filename)> 
    <cfset filename = href="ForceDownload.cfm?filename=#Name#"> 
    <cfset fileInfo = GetFileInfo(folder & filename)> 
    <cfset mimeType = getPageContext().getServletContext().getMimeType(folder & filename)> 
    <cfheader name="Content-Disposition" value="attachment; filename=""#filename#"""> 
    <cfheader name="Expires" value="#Now()#"> 
    <cfheader name="Content-Length" value="#fileInfo.size#"> 
    <cfcontent type="#mimeType#" file="#folder##filename#" deletefile="No"> 
</cfif> 

ich einen Tag erhält folgende Fassung <a href="Logos\#Name#" >#Name#</a> mit dem folgenden Befehl einen Tag <a href="ForceDownload.cfm">#Name#</a>

Wenn Ich habe das gemacht, es gab keine Fehler. Wenn ich jedoch auf eines der Bilder klicke, geht es auf eine leere Seite, auf der das Bild nicht angezeigt wird.

Ich bin nicht sicher, wie der Name der Dateien zu übergeben

Jede Hilfe würde geschätzt werden, um Dateinamen.

Der Fehler, der enter image description here

-Update zeigt:

ich den Hyperlink aktualisiert: <a href="ForceDownload.cfm:filename=#Name#">#Name#</a></td>

und ich habe die folgenden: *

<cfparam name="http://portal/regalnet_test/ForceDownload.cfm?filename=#Name#" default=""> 
<cfset folder = "\\oc2-web\wwwroot\RegalNet_Test\Downloads\MktgDownloads\Logos\"> 

<!--- If the path to the file is valid ---> 
<cfif fileExists(folder & filename)> 
    <cfset filename = name> 
    <cfset fileInfo = GetFileInfo(folder & filename)> 
    <cfset mimeType = getPageContext().getServletContext().getMimeType(folder & filename)> 
    <cfheader name="Content-Disposition" value="attachment; filename=""#filename#"""> 
    <cfheader name="Expires" value="#Now()#"> 
    <cfheader name="Content-Length" value="#fileInfo.size#"> 
    <cfcontent type="#mimeType#" file="#folder##filename#" deletefile="No"> 

<!--- Otherwise, display debugging information (Dev only) ---> 
<cfelse> 
    <cfoutput> 
    Sorry, unable to find file: #folder##filename#<br> 
     Does the folder exist? #directoryExists(folder)#<br> 
    Does the File Exist? = #fileExists(folder & filename)# 
    </cfoutput> 
</cfif> 
+0

Sie benötigen ein zusätzliches .cfm-Skript, um den Download zu verarbeiten. Dieses neue Skript würde den Code aus dem Blogeintrag enthalten (achten Sie darauf, den Ordnerpfad zu aktualisieren). Erstellen Sie dann einen Hyperlink, der auf das neue Skript verweist, und übergibt den Bilddateinamen als URL-Parameter namens "Dateiname". – Leigh

+0

@Leigh Können Sie mir zeigen. Auch hier bin ich sehr neu. –

+0

Probieren Sie es zuerst aus. 1. Kopieren Sie den genauen Code in eine neue .cfm-Datei. 2. Ändern Sie den Text "[PATH TO YOUR FILES FOR DOWNLOAD]" in einen echten Dateipfad wie "c: \ path \ yourimages \" 3. Testen Sie nun das Skript in Ihrem Browser, indem Sie den Dateinamen eines realen Bildes dorthin übergeben Verzeichnis als URL-Parameter namens 'Dateiname'. Zum Beispiel "http: //yoursite/yourNewPage.cfm? Filename = someImageFileThatExists.png". Was ist das Ergebnis? – Leigh

Antwort

1

Welche ope Bewertungssystem und Webserver benutzen Sie? (Sie haben in Ihrer Frage nicht angegeben.) Wenn sich die Dateien in einem öffentlich zugänglichen Pfad befinden, können Sie eine Regel hinzufügen. Wir haben die folgende IIS web.config-Datei zu Unterverzeichnissen hinzugefügt, die hochauflösende Bilder enthalten, die nur für den "Download" verfügbar sind. Wir bevorzugen diesen Ansatz, statt einen wertvollen ColdFusion-Thread zu verwenden, um statische Dateien bei langsamen oder missbräuchlichen (dh DoS-) Anfragen zu liefern. (Wir haben Bots wiederholt, die statische Dateien wie diese anfordern und dann nach dem Download abbrechen, nachdem sie festgestellt haben, dass es sich um eine Datei handelt. Zu diesem Zeitpunkt ist es für ColdFusion bereits zu spät, da bereits die gesamte Datei in den RAM geladen wurde Lieferfehler abgebrochen und protokolliert den Fehler)

. HINWEIS: Wir haben leider nur cfcontent verwenden, wenn der Inhalt ist entweder persönlich & Passwort geschützt oder nicht bereits in einem öffentlich zugänglichen Web-Pfad befindet.

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <system.webServer> 
     <httpProtocol> 
      <customHeaders> 
       <add name="Content-disposition" value="Attachment" /> 
      </customHeaders> 
     </httpProtocol> 
    </system.webServer> 
</configuration> 

In Bezug auf die HTML5 download Attribut kann noch einige Browser das Attribut selbst ehren, wenn der Doctype nicht korrekt HTML5 verwendet wird. Wenn Sie sich Sorgen um Validierungsdienste machen, können Sie möglicherweise das Attribut nach dem Laden der Seite mithilfe von JavaScript hinzufügen.

+0

Gültige Punkte. Ehrlich gesagt, ich nahm nur an, dass dies eine Lernübung war. – Leigh

+0

Die Frage war, wie man einen Download erzwingt, wenn das HTML5-AHREF-Attribut "Download" fehlt. Es ist zwar möglich, dies mit ColdFusion zu tun, dies wird jedoch nicht empfohlen und wirkt sich negativ auf die gesamte ColdFusion-Umgebung aus ... vor allem, nachdem Suchmaschinen-Bots den Links mit mehreren gleichzeitigen Anfragen folgen. –

+0

Dies ist einer der Gründe, weshalb ich ColdFusion "XSendFile" -Unterstützung empfohlen habe, damit Dateien in geschützten, nicht öffentlichen Pfaden für Endbenutzer mit dem Webserver anstelle von ColdFusion bereitgestellt werden können. Dies wurde im Jahr 2011 gefragt, aber ich glaube nicht, dass eine einfache/native Lösung existiert. http://stackoverflow.com/questions/8652981/how-to-prevent-external-users-from-viewing-document-files/ –