Related
Server: CF10
Platform: Windows and Linux (Win in DEV windows in PROD)
So I'm generating an excel file for a client, but having trouble getting date fields to behave properly. Everything else seems to work just fine but when I send the data to excel to be generated, excel treats it as just text. So when the field gets sorted, it is handled as such.
More info: The column I'm trying to configure is called Arrival Date it is arriving formatted as mm/dd/yyyy. (I have tried to format is as m/d/yy, but when it arrives in the sheet that doesn't work as well.)
Code:
<cfset filename = expandPath("./TDYData_(#DateFormat(now(),'mmddyy')#).xls")>
<!--- Make a spreadsheet object --->
<cfset s = spreadsheetNew("TDYData")>
<!--- Add header row --->
<cfset spreadsheetAddRow(s, "TDY Phase,Full Name,Employment Category,Gender,Originating Agency,Agency Comments,Originating Office,Office Comments,Originating Country,TDY Request Received,Mission Office Supported,Type of TDY Support,eCC Submission,eCC Approval,eCC Point of Contact,Date of Departure from Originating Country,Arrival Date,Departure Date,Accomodation Type,Accomodation Comments,Assigned Desk,Local Mobile Number,TDY Comments")>
<!--- format header --->
<cfset spreadsheetFormatRow(s, {bold=true,fgcolor="lemon_chiffon",fontsize=10}, 1)>
<!--- Add query --->
<cfset spreadsheetAddRows(s, myExcel)>
<cfset SpreadSheetAddFreezePane(s,0,1)>
<cfset SpreadsheetFormatColumn(s, {dataformat="m/d/yy"}, 17) />
<cfset SpreadsheetFormatColumn(s, {alignment="right"}, 16) />
<cfheader name="content-disposition" value="attachment; filename=TDY_Data_(#DateFormat(now(),'mmddyy')#).xls">
<cfcontent type="application/msexcel" variable="#spreadsheetReadBinary(s)#" reset="true">
Any ideas?
Thanks
So I have a workable solution:
<cfset therow = 0>
<cfoutput query="myExcel" startrow="1">
<cfset therow = myExcel.currentrow + 1>
<cfif len(eCCSubDate) GT 0>
<cfset SpreadsheetSetCellFormula(s,"DATEVALUE(#Chr(34)##eCCSubDate##Chr(34)#)",therow,13)>
</cfif>
<cfif len(eCCApproved) GT 0>
<cfset SpreadsheetSetCellFormula(s,"DATEVALUE(#Chr(34)##eCCApproved##Chr(34)#)",therow,14)>
</cfif>
<cfif len(DateDepartCntry) GT 0>
<cfset SpreadsheetSetCellFormula(s,"DATEVALUE(#Chr(34)##DateDepartCntry##Chr(34)#)",therow,16)>
</cfif>
<cfif len(DateArrive) GT 0>
<cfset SpreadsheetSetCellFormula(s,"DATEVALUE(#Chr(34)##DateArrive##Chr(34)#)",therow,17)>
</cfif>
<cfif len(DateDepart) GT 0>
<cfset SpreadsheetSetCellFormula(s,"DATEVALUE(#Chr(34)##DateDepart##Chr(34)#)",therow,18)>
</cfif>
</cfoutput>
So I set a variable for a counter then loop back over the query and check to make sure its not an empty cell then apply a formula to the cell the chr(34) are quotes then the data value. By using this, (After the data is written) it will at least behave like a real date field.
I am just confusing myself with this one. I have a data log that is saved on the database as something like this:
Log-Date: 10/26/2012. Record created. Admission Date: 08/01/2012
Log-Date: 06/20/2013 Discharged. Discharge Date:10/15/2012
Reason for Discharge:01 - (routine discharge).
<!--- all other tracking info --->
I am trying to pull from this log only the discharges and sort/filter them by date. This log is saved in the database as one column varchar(MAX). I need to sort this data and only pull the discharge dates / reason using regex and then apply a filter. The end product should end up with me putting that array in a table with PATIENT | DISCHARGE DATE | DISCHARGE REASON My code right now is giving me some errors as it is leaving me with some empty array values. My question is that I need to remove those blank values and sort by the date, but I am unsure where to begin.
<cfquery name="getDischarge" datasource="#this.dsn#">
select PatientsName, LogData from Patient
</cfquery>
<cfoutput query="getDischarge" group="PatientsName">
<cfif LogData neq "">
<cfsavecontent variable="str">
#LogData#
</cfsavecontent>
<cfset possibilities = reMatch("Discharge Date?:(\d\d?/\d\d?/\d{4})\s*Reason for Discharge:\d* - ((?:(?!Log-Date:).)*)", str)>
<cfset dateArray = ArrayNew(2)>
<cfloop index="w"
array="#possibilities#">
<cfif w NEQ "">
<!--- create 1 dimensional temp array to hold DATE | REASON --->
<cfset tempArray = ArrayNew(1)>
<!--- trim our regex to have only the date & then DateFormat --->
<cfset theDate = #Mid(w, 16, 11)#>
<cfset formatDate = #dateformat('#thedate#','mm-dd-yyyy')#>
<!--- use our regex to find the reason for discharge --->
<cfset theReason = reMatch("Reason for Discharge:\d* - ((?:(?!Log-Date:).)*)", str)>
<!--- append our DATE | REASON to 1d temp array --->
<cfset ArrayAppend(tempArray, '#formatDate#')>
<cfset ArrayAppend(tempArray, '#theReason#')>
<!--- append our 1d array to our 2d array to output matching DATE | REASON --->
<cfset #ArrayAppend(dateArray, '#tempArray#')#>
</cfif>
</cfloop>
<cfdump var="#dateArray#">
</cfif> <!--- logdata neq "" --->
</cfoutput>
To me, logically, this should work and omit blank values, but this is what I get when I dump this data:
Looks like you are struggling with the Jakarta ORO regular expression engine that is used in ColdFusion. reMatch/reMatchNoCase are terrible when it comes to capturing. Java on the other hand offers the POSIX regular expression engine.
<cfset data = [
"Log-Date: 10/26/2012. Record created. Admission Date: 08/01/2012
Log-Date: 06/20/2013 Discharged. Discharge Date:10/15/2012
Reason for Discharge:01 - (routine discharge).
More stuff...",
"Log-Date: 10/26/2012. Record created. Admission Date: 08/01/2012
Log-Date: 06/20/2013 Discharged. Discharge Date:10/16/2012
Reason for Discharge:lorem ipsum."
]>
<cfset result = queryNew("DISCHARGE_DATE,DISCHARGE_REASON", "VARCHAR,VARCHAR")>
<cfloop array="#data#" index="line">
<cfset dischargeDate = reMatchGroupNoCase("Discharge Date:([0-9]{2}/[0-9]{2}/[0-9]{4})", line)>
<cfset dischargeReason = reMatchGroupNoCase("Reason for Discharge:([^\n]*)", line)>
<cfset hasDate = (arrayLen(dischargeDate) eq 1)>
<cfset hasReason = (arrayLen(dischargeReason) eq 1)>
<cfif hasDate or hasReason>
<cfset rowIndex = queryAddRow(result, 1)>
<cfif hasDate and isDate(dischargeDate[1])>
<cfset querySetCell(result, "DISCHARGE_DATE", dateFormat(dischargeDate[1], "yyyy-mm-dd"), rowIndex)>
</cfif>
<cfif hasReason>
<cfset querySetCell(result, "DISCHARGE_REASON", dischargeReason[1], rowIndex)>
</cfif>
</cfif>
</cfloop>
<cfquery name="orderedResult" dbType="query">
SELECT
*
FROM
[result]
ORDER BY
[DISCHARGE_DATE] ASC
</cfquery>
<cfdump var="#orderedResult#">
And here is the function you need:
<cffunction name="reMatchGroupNoCase" access="public" output="false" returnType="array">
<cfargument name="regex" type="string" required="true">
<cfargument name="value" type="string" required="true">
<cfset LOCAL.result = []>
<cfset LOCAL.Pattern = createObject("java", "java.util.regex.Pattern")>
<cfset ARGUMENTS.regex = LOCAL.Pattern.compile(ARGUMENTS.regex, bitOr(LOCAL.Pattern["CASE_INSENSITIVE"], LOCAL.Pattern["UNICODE_CASE"]))>
<cfset LOCAL.buffer = ARGUMENTS.regex.matcher(toString(ARGUMENTS.value))>
<cfset LOCAL.length = LOCAL.buffer.groupCount()>
<cfloop condition="LOCAL.buffer.find()">
<cfloop from="1" to="#LOCAL.length#" index="LOCAL.i">
<cfset LOCAL.value = LOCAL.buffer.group(
javaCast("int", LOCAL.i)
)>
<cfif isNull(LOCAL.value)>
<cfcontinue>
</cfif>
<cfset LOCAL.result.add(LOCAL.value)>
</cfloop>
</cfloop>
<cfreturn LOCAL.result>
</cffunction>
I recommend this approach:
with q1 as (select 'Log-Date: 10/26/2012. Record created. Admission Date: 08/01/2012
Log-Date: 06/20/2013 Discharged. Discharge Date:10/15/2012
Reason for Discharge:01 - (routine discharge). ' logData
)
select substring(logData, patindex('%Admission Date: %', logdata) + 16
, 10) admitDate
from q1
where logData like '%Discharge Date:%'
That returns 08/01/2012. You may have some complications for a variety of reasons, but the general idea should work.
Making the array:
<cfset tempArr = DeserializeJSON(URL.data) />
<cfset temp1 = "" />
<cfset temp2 = "" />
<cfset selectList1 = "" />
<cfset selectList2 = "" />
<cfloop array=#tempArr# index="i">
<cfset temp1 = GetToken(i,1,":")>
<cfset temp2 = GetToken(i,2,":")>
<cfset selectList1 = listAppend(selectList1, temp1)>
<cfset selectList2 = listAppend(selectList2, temp2)>
</cfloop>
Looping through it??:
<cfquery name="sample" datasource="database">
SELECT *
FROM table
WHERE
<cfloop from="1" to="#listLen(selectList1)#" index="i"/>
#ListGetAt(selectList1, i)# = <cfqueryparam value="#ListGetAt(selectList2)#" />
</cfloop>
<cfif i neq listLen(#selectList1#)>
AND
</cfif>
</cfquery>
My intention is to search dynamically in a table based on the array that was received from the javascript page. The data comes in this form -> columnName:searchBy. ie, a sample piece would be name:Jim. I would like to build in dynamic code that would allow me to search by different columns but I can't get my loop to work. I get this error if it helps:
(Invalid CFML construct found on line 20 at column 59.)
which is this line:
<cfloop from="1" to="#listLen(selectList1)#" index="i" />
Kyle's answer is 100% correct, but here's a better solution. Using lists is a very inefficient process (see below) and using listGetAt will only anger future programmers. You can use an array to house the data and use a default WHERE statement to simplify your looping.
<cfset tempArr = DeserializeJSON(URL.data) />
<cfset temp1 = "" />
<cfset temp2 = "" />
<cfset selectList1 = [] />
<cfset selectList2 = [] />
<cfloop array=#tempArr# index="i">
<cfset temp1 = GetToken(i,1,":")>
<cfset temp2 = GetToken(i,2,":")>
<cfset arrayAppend(selectList1, temp1)>
<cfset arrayAppend(selectList2, temp2)>
</cfloop>
<cfif NOT arrayIsEmpty(tempArr)>
<cfquery name="sample" datasource="database">
SELECT column1, column2, column3
FROM table
WHERE 1 = 1
<cfloop from="1" to="#listLen(selectList1)#" index="i"/>
AND #selectList1[i]# = <cfqueryparam value="#selectList2[i]#" />
</cfloop>
</cfquery>
</cfif>
When you append to a list a new string is created in memory that combines the two previous string and the previous string is deleted. This is definitely premature optimization, but it's still a good practice to avoid using lists especially when you need to access elements in them.
I think your problem might be that the cfloop tag is self closing. Try this instead:
<cfloop from="1" to="#listLen(selectList1)#" index="i">
list attribute can be used in <cfloop>.
<cfloop list="#selectList1#" index="i">
#i# <!--- list element can be processed here with variable name #i# --->
</cfloop>
I have the following which is working half way. I am trying to CFZip the contents of a downloaded Excel file but there is one problem involved. The code below shows that there are 3 tickets. 1 main ticket and 2 tickets that are the extended answers of the main ticket. Attachments are allowed on all tickets, the main ones and the children's too.
When I try to download the Excel file, I am also trying to download two folders that should be inside the Zip file. One that should be pointing to the child and one to the parent. Both should have their respective attachments. I am missing some big piece of code here.
Here is the code:
<cfquery datasource="#request.dsn#" name="mainTickets">
SELECT s.ticketID,CAST(s.DateRaised as
varchar) AS DateRaised,s.Summary,s.RaisedBy,s.AssignedTo,
st.Status
,CAST(s.LastUpdatedDate as varchar),CAST(s.TimeSpent as float) as
timespent,stt.TicketType,s.LastUpdatedComment
from supportTickets s
inner join SupportStatusType st on st.statusID = s.status
inner join supportTicketType stt on stt.TicketTypeID = s.TicketType
where s.ticketID IN (<cfqueryparam cfsqltype="cf_sql_numeric" value="#url.ticketID#" list="yes">
)
</cfquery>
<cfset filename = "Detailed_Ticket_Summary" & dateformat(now(), 'mm_dd_yyyy') & "." & "xls">
<cfset s = spreadsheetNew("Tickets Summary")>
<!--- Add header row --->
<cfset spreadsheetAddRow(s, "TicketID,Date Raised,Summary,Raised By,AssignedTo,Status,Last Updated Date, Time Spent, Ticket Type, Last Updated Comment, Details")>
<!--- format header --->
<cfset spreadsheetFormatRow(s, #format1#, 1)>
<cfset spreadsheetAddRows(s, mainTickets)>
<cfset SpreadsheetFormatColumn(s, {textwrap=true}, 10)>
<cfset SpreadsheetFormatColumn(s, {textwrap=true}, 3)>
<cfloop from="1" to="#mainTickets.recordcount#" index="i">
<cfset k = i + 1>
<cfset SpreadsheetSetCellFormula(s, 'HYPERLINK("[Tickets Summary]TicketID_#mainTickets.ticketID#!A1","Click Here")',#k#,11)>
<cfset SpreadsheetFormatCell(s, {bold=true, color='blue', bottomborder='dotted'}, #k#, 11)>
</cfloop>
<cfif mainTickets.recordcount>
<cfoutput query="mainTickets">
<cfquery datasource="#request.dsn#" name="fetchTickets">
SELECT s.ticketID,s.ticketNumber,CAST(s.DateRaised as
varchar),s.Summary,s.RaisedBy,s.AssignedTo,
st.Status
,CAST(s.LastUpdatedDate as varchar),s.TimeSpent,stt.TicketType,s.LastUpdatedComment
from supportTicketsHistory s
inner join SupportStatusType st on st.statusID = s.status
inner join supportTicketType stt on stt.TicketTypeID = s.TicketType
where s.ticketnumber = <cfqueryparam cfsqltype="cf_sql_numeric" value="#mainTickets.ticketID#">
</cfquery>
<!--- Add query --->
<cfif fetchTickets.recordcount>
<cfset SpreadsheetCreateSheet(s, 'TicketID_#ticketID#')>
<cfset SpreadsheetSetActiveSheet(s, 'TicketID_#ticketID#')>
<!--- Add header row --->
<cfset spreadsheetAddRow(s, "TicketID,Ticket Number,Date Raised,Summary,Raised By,AssignedTo,Status,Last Updated Date, Time Spent, Ticket Type, Last Updated Comment")>
<!--- format header --->
<cfset spreadsheetFormatRow(s, #format1#, 1)>
<cfset SpreadsheetAddRows(s, fetchTickets)>
<cfset SpreadsheetFormatColumn(s, {textwrap=true}, 11)>
<cfset SpreadsheetSetActiveSheetNumber(s, 1)>
<cfset ielements = ValueList(mainTickets.ticketID)>
<cfquery datasource="#request.dsn#" name="getAttachments">
SELECT Attach_FileName,Attach_FileSize,Attach_Time,SupportTicketID
FROM support_attachments
WHERE SupportTicketID = #val(fetchTickets.ticketnumber)#
</cfquery>
<cfquery datasource="#request.dsn#" name="getChkAttachments">
SELECT Support_Attach_FileName,Support_Attach_FileSize,Support_Attach_Time,
Support_SupportTktHistoryID,Support_SupportTicketID
FROM support_attach_History
WHERE Support_SupportTicketID = #val(fetchTickets.ticketnumber)#AND Support_SupportTktHistoryID
in (SELECT ss.ticketID FROM supportTicketsHistory ss
WHERE ss.ticketNumber = #val(fetchTickets.ticketnumber)#)
</cfquery>
<!--- handle the attachments for the Ticket in ZIp Format --->
<cfset currentDirectory = GetDirectoryFromPath(GetTemplatePath()) & getAttachments.SupportTicketID>
<cfif !DirectoryExists(currentDirectory)>
<cfdirectory action="create" directory="#currentDirectory#">
</cfif>
<cfset currentDirectory2 = GetDirectoryFromPath(GetTemplatePath()) & getChkAttachments.Support_SupportTktHistoryID>
<cfif !DirectoryExists(currentDirectory2)>
<cfdirectory action="create" directory="#currentDirectory2#">
</cfif>
<cfif getAttachments.recordcount>
<cfloop query="getAttachments">
<cffile action="copy"
source="#ExpandPath('attachments/#getAttachments.Attach_FileName#')#"
destination="#currentDirectory#\">
</cfloop>
</cfif>
<cfif getChkAttachments.recordcount>
<cfloop query="getChkAttachments">
<cffile action="copy"
source="#ExpandPath('attachments/#getChkAttachments.Support_Attach_FileName#')#"
destination="#currentDirectory2#\">
</cfloop>
</cfif>
<!--- handle the attachments for the Ticket in ZIP Format --->
<cfset spreadsheetWrite(s, filename, true)>
<cfset dest2 = getTempDirectory() & "/" & "Tickets" & ".zip">
<cfzip action="zip" file="#dest2#">
<cfdirectory action="list" directory="#currentDirectory#/" name="listRoot">
<cfdirectory action="list" directory="#currentDirectory2#/" name="listRoot2">
<cfset lstFiles = ValueList(listRoot.name)>
<cfset lstFiles2 = ValueList(listRoot2.name)>
<cfloop list="#lstFiles#" index="k">
<cfzipparam source="#currentDirectory#/#k#" recurse="yes" filter="*"/>
</cfloop>
<cfloop list="#lstFiles2#" index="kk">
<cfzipparam source="#currentDirectory2#/#kk#" recurse="yes" filter="*"/>
</cfloop>
</cfzip>
</cfif>
</cfoutput>
</cfif>
<cfheader name="Content-Disposition" value="attachment;filename=#ListFirst(filename,'.')#.zip">
<cfcontent file="#dest2#" type="application/zip" deletefile="true" reset="true">
I sorted it out here is the way I have done it.
<cfquery datasource="#request.dsn#" name="mainTickets">
SELECT s.ticketID,CAST(s.DateRaised as
varchar) AS DateRaised,s.Summary,s.RaisedBy,s.AssignedTo,
st.Status
,CAST(s.LastUpdatedDate as varchar),CAST(s.TimeSpent as float) as timespent,stt.TicketType,s.LastUpdatedComment
from supportTickets s
inner join SupportStatusType st on st.statusID = s.status
inner join supportTicketType stt on stt.TicketTypeID = s.TicketType
where s.ticketID IN (<cfqueryparam cfsqltype="cf_sql_numeric" value="#url.ticketID#" list="yes">)
</cfquery>
<cfset filename = "Detailed_Ticket_Summary" & dateformat(now(),'mm_dd_yyyy') & "." & "xls">
<cfset s = spreadsheetNew("Tickets Summary")>
<!--- Add header row --->
<cfset spreadsheetAddRow(s, "TicketID,Date Raised,Summary,Raised By,AssignedTo,Status,Last Updated Date, Time Spent, Ticket Type, Last Updated Comment, Details")>
<!--- format header --->
<cfset spreadsheetFormatRow(s,#format1#,1)>
<cfset spreadsheetAddRows(s, mainTickets)>
<cfset SpreadsheetFormatColumn(s,{textwrap=true},10)>
<cfset SpreadsheetFormatColumn(s,{textwrap=true},3)>
<cfloop from="1" to="#mainTickets.recordcount#" index="i">
<cfset k = i+1>
<cfset SpreadsheetSetCellFormula(s, 'HYPERLINK("[Tickets Summary]TicketID_#mainTickets.ticketID#!A1","Click Here")',#k#,11)>
<cfset SpreadsheetFormatCell(s,{bold=true,color='blue',bottomborder='dotted'},#k#,11)>
</cfloop>
<cfif mainTickets.recordcount>
<cfoutput query="mainTickets">
<cfquery datasource="#request.dsn#" name="fetchTickets">
SELECT s.ticketID,s.ticketNumber,CAST(s.DateRaised as
varchar),s.Summary,s.RaisedBy,s.AssignedTo,
st.Status
,CAST(s.LastUpdatedDate as varchar),s.TimeSpent,stt.TicketType,s.LastUpdatedComment
from supportTicketsHistory s
inner join SupportStatusType st on st.statusID = s.status
inner join supportTicketType stt on stt.TicketTypeID = s.TicketType
where s.ticketnumber = <cfqueryparam cfsqltype="cf_sql_numeric" value="#mainTickets.ticketID#">
</cfquery>
<!--- Add query --->
<cfset Temp = GetDirectoryFromPath(GetTemplatePath()) & 'temp'>
<cfif !DirectoryExists(Temp)>
<cfdirectory action="create" directory="#Temp#">
</cfif>
<cfif fetchTickets.recordcount>
<cfset SpreadsheetCreateSheet(s , 'TicketID_#ticketID#')>
<cfset SpreadsheetSetActiveSheet(s , 'TicketID_#ticketID#')>
<!--- Add header row --->
<cfset spreadsheetAddRow(s, "TicketID,Ticket Number,Date Raised,Summary,Raised By,AssignedTo,Status,Last Updated Date, Time Spent, Ticket Type, Last Updated Comment")>
<!--- format header --->
<cfset spreadsheetFormatRow(s,#format1#,1)>
<cfset SpreadsheetAddRows(s , fetchTickets)>
<cfset SpreadsheetFormatColumn(s,{textwrap=true},11)>
<cfset SpreadsheetSetActiveSheetNumber(s, 1)>
<cfset ielements = ValueList(mainTickets.ticketID)>
<cfquery datasource="#request.dsn#" name="getAttachments">
SELECT Attach_FileName,Attach_FileSize,Attach_Time,SupportTicketID
FROM support_attachments
WHERE SupportTicketID = #val(fetchTickets.ticketnumber)#
</cfquery>
<cfquery datasource="#request.dsn#" name="getChkAttachments">
SELECT Support_Attach_FileName,Support_Attach_FileSize,Support_Attach_Time,
Support_SupportTktHistoryID,Support_SupportTicketID
FROM support_attach_History
WHERE Support_SupportTicketID = #val(fetchTickets.ticketnumber)#
AND Support_SupportTktHistoryID in (SELECT ss.ticketID FROM supportTicketsHistory ss
WHERE ss.ticketNumber = #val(fetchTickets.ticketnumber)#)
</cfquery>
<cfif getAttachments.recordcount>
<!--- handle the attachments for the Ticket in ZIp Format --->
<cfset currentDirectory = "MainTicketID_" & "Number_" & getAttachments.SupportTicketID & "_Attachments">
<cfdump var="#temp#\#currentDirectory#">
<cfif !DirectoryExists("#temp#\#currentDirectory#")>
<cfdirectory action="create" directory="#temp#\#currentDirectory#">
</cfif>
<cfdump var="#currentDirectory#">
<cfif getAttachments.recordcount>
<cfloop query="getAttachments">
<cffile action="copy" source="#ExpandPath('attachments/#getAttachments.Attach_FileName#')#"
destination="#temp#\#currentDirectory#\">
</cfloop>
</cfif>
</cfif>
<cfif getChkAttachments.recordcount>
<cfset currentDirectory2 = "MainTicket_" & getChkAttachments.Support_SupportTicketID & "_Updated_Child_" & getChkAttachments.Support_SupportTktHistoryID & "_Attachments">
<cfif !DirectoryExists("#temp#\#currentDirectory2#")>
<cfdirectory action="create" directory="#temp#\#currentDirectory2#">
</cfif>
<cfif getChkAttachments.recordcount>
<cfloop query="getChkAttachments">
<cffile action="copy" source="#ExpandPath('attachments/#getChkAttachments.Support_Attach_FileName#')#"
destination="#temp#\#currentDirectory2#\">
</cfloop>
</cfif>
</cfif>
<!--- handle the attachments for the Ticket in ZIP Format --->
<cfset spreadsheetWrite(s, filename, true)>
<cfset dest2 = getTempDirectory() & "/" & "Tickets" & ".zip">
<cfzip action="zip" file="#dest2#" overwrite="true">
<cfzipparam source="#temp#"/>
<cfzipparam source="#filename#"/>
</cfzip>
</cfif>
</cfoutput>
</cfif>
<cfdirectory action="delete" directory="#temp#" recurse="yes">
<cfheader name="Content-Disposition" value="attachment;filename=#ListFirst(filename,'.')#.zip">
<cfcontent file="#dest2#" type="application/zip" deletefile="true" reset="true">
This can help someone instead how to nest the cfzip functionality
This is a strange one - I have 'virtually' identical code on 2 pages, it works on one but not the other. The incredibly unhelpful error message, "S3 Error Message." doesn't shed any light on where I'm going wrong with this.
The code below is identical on both pages - the only (very slight) difference between the 2 pages is the way imgLink is generated - on the working page it is obtained from a single source (an XML feed) and cfset, on the none-working page imgLink is initially set as 'none' and then a number of sources are checked until it finds one - it's still cfset in the same way, and I have a cfif to make sure it's valid before processing. HOWEVER - I have also tried hardcoding the source (i.e., pasting in the value that would usually be in the imgLink cfset) and it still fails.
I've debugged this in every way I can possibly think in the last day, without success. So, I guess I'm looking for pointers as to what else I should look at that could be causing it to fail.
The full error returned is -
An error occurred when performing a file operation create on file s3://mybucket/1577-67BC4EF7-1B21-866F-32E95DF67F3336C6-f.jpg.
The cause of this exception was: org.apache.commons.vfs.FileSystemException: Unknown message with code "S3 Error Message."..
And my code is;
<cfscript>
this.name ="Object Operations";
this.s3.accessKeyId = "accessKey";
this.s3.awsSecretKey = "secretKey";
this.s3.defaultLocation="EU";
</cfscript>
<!--- CFImage Stuff --->
<!--- S3 Permissions --->
<cfset perms = [{group="all", permission="read"}]>
<!--- Create the Images ---->
<cfset imageuuid = '#CreateUUID()#'>
<cfset imagefull = '#getid.id#-#imageuuid#-f.jpg'>
<cfset imagemain = '#getid.id#-#imageuuid#-m.jpg'>
<cfset imagethumb = '#getid.id#-#imageuuid#-t.jpg'>
<cfimage action="read" name="img1" source="#imgLink#">
<!--- Create the full size image 505 x N --->
<cfif img1.height GT img1.width>
<cfif img1.width GTE 505>
<cfset ImageResize(img1,'505','')>
</cfif>
<cfelseif img1.width GT img1.height>
<cfif img1.width GTE 505>
<cfset ImageResize(img1, '505','')>
</cfif>
</cfif>
<cfset ImageWrite(img1, "s3://mybucket/#imagefull#")>
<cfset StoreSetACL("s3://mybucket/#imagefull#","#perms#")>
<!--- Create the main size image 251 x N --->
<cfif img1.height GT img1.width>
<cfif img1.width GTE 251>
<cfset ImageResize(img1,'251','')>
</cfif>
<cfelseif img1.width GT img1.height>
<cfif img1.width GTE 251>
<cfset ImageResize(img1, '251','')>
</cfif>
</cfif>
<cfset ImageWrite(img1, "s3://mybucket/#imagemain#")>
<cfset StoreSetACL("s3://mybucket/#imagemain#","#perms#")>
<!--- Create the thumbnail 52 x 52 --->
<!--- resize image to 52 pixels tall if width is greater then height --->
<cfif img1.height GT img1.width>
<cfset ImageResize(img1,'52','')>
<cfset fromX = img1.Height / 2 - 26>
<cfset ImageCrop(img1,0,fromX,52,52)>
<!--- resize image to 75 pixels wide if height is greater then width --->
<cfelseif img1.width GT img1.height>
<cfset ImageResize(img1,'','52')>
<cfset fromY = img1.Width / 2 - 26>
<cfset ImageCrop(img1,fromY,0,52,52)>
<cfelse>
<cfset ImageResize(img1,'','52')>
<cfset ImageCrop(img1,0,0,52,52)>
</cfif>
<cfset ImageWrite(img1, "s3://mybucket/#imagethumb#")>
<cfset StoreSetACL("s3://mybucket/#imagethumb#","#perms#")>
Just realised I hadn't added my solution to this, so here it is- The folder in which the 'non-working' code was in had it's own Application.cfc, which didn't include the S3 elements in the code posted above. The 'working' code did have that in the corresponding Application.cfc.
Not quite sure why that had to be in Application.cfc when it was at the
The this object in application.cfc is an application component and this on ColdFusion page is just a structure variable. Put <cfdump var=#this#> in both places, application.cfc and yourfile.cfm, to see the difference.