Удаление файла в Coldfusion
У меня есть форма с утилитой для прикрепления документов, и она использует файл cfm для отображения их, как показано ниже:
<cfsilent>
<cfparam name="request.ID" type="numeric" default="0">
<cfparam name="request.filename" type="string" default="">
<cfscript>
local = structNew();
</cfscript>
<!--- get the request data --->
<cfinvoke
component="#application.config.CFCOMPONENTS_PREFIX#com.mycompany.request_manager.responseEntity"
method="get"
returnvariable="local.responses">
<cfinvokeargument name="ID" value="#request.ID#"/>
</cfinvoke>
<cfscript>
local.fileName = request.filename;
local.pathToFile = application.virtualPaths.APPROOT&"library/investigations/"&local.responses.report_number&"/"&local.fileName;
</cfscript>
</cfsilent>
<cfheader name="content-type" value="application/download">
<cfheader name="Content-Disposition" value="attachment; filename=#local.fileName#">
<cfcontent type="application/download" file="#ExpandPath(local.pathToFile)#" deletefile="No">
<cfabort>
Мне нужна возможность удалить файл на сервере, используя аналогичный файл cfm. У меня есть ссылка для удаления, которая имеет ссылку на приведенную ниже страницу под названием redirect-delete.cfm. Я хочу, чтобы файлы удалялись на самой форме, а пользователь оставался на странице формы.
<cfsilent>
<cfparam name="request.ID" type="numeric" default="0">
<cfparam name="request.filename" type="string" default="">
<cfscript>
local = structNew();
</cfscript>
<!--- get the request data --->
<cfinvoke
component="#application.config.CFCOMPONENTS_PREFIX#com.mycompany.request_manager.responseEntity"
method="get"
returnvariable="local.responses">
<cfinvokeargument name="ID" value="#request.ID#"/>
</cfinvoke>
<cfscript>
local.fileName = request.filename;
local.pathToFile = application.virtualPaths.APPROOT&"library/investigations/"&local.responses.report_number&"/"&local.fileName;
</cfscript>
</cfsilent>
<cffile action="delete" file="#ExpandPath(local.pathToFile)#">
<cfabort>
Что я должен добавить в файл redirect-delete.cfm, чтобы у пользователя появилось всплывающее окно, в котором вы уверены, что хотите удалить. Если пользователь нажимает "да", вложение должно быть удалено, но пользователь все равно должен оставаться в форме.
2 ответа
Итак, у вас есть форма плюс ссылка. Если пользователь выбирает ссылку, вы хотите, чтобы появилось предупреждение, и если пользователь принимает, файл удаляется на сервере, но пользователь остается в форме? Мой подход будет следующим:
- Поставить 1 пиксель
iframe
на странице формы, которая содержит код для удаления файла. - Для вашего тега привязки сделайте ссылку на javascript, чтобы вы могли использовать всплывающее окно подтверждения.
- На странице, которая удаляет файл, добавьте дополнительный код, который использует javascript, чтобы что-то сделать со ссылкой на странице формы. Вы можете полностью избавиться от него или заменить его на утверждение о том, что файл был удален.
Обратите внимание, что шаг 3 будет проще, если у вас есть ссылка внутри <div>
,
Если вы можете, я бы абстрагировал оба этих файла cfm в cfc.methods. Из используемых тегов, я предполагаю, что вы используете CF7 или около того...
В CF создайте этот cfc примерно так:
<cfcomponent displayName="ManageAttachment">
<cffunction name="attachFile" access="public" >
<cfargument name="ID" type="numeric" default="0">
<cfargument name="filename" type="string" default="">
<cfscript>
local = structNew();
</cfscript>
<cfinvoke
component="#application.config.CFCOMPONENTS_PREFIX#com.mycompany.request_manager.responseEntity"
method="get"
returnvariable="local.responses">
<cfinvokeargument name="ID" value="#Arguments.ID#"/>
</cfinvoke>
<cfscript>
local.fileName = Arguments.filename;
local.pathToFile = application.virtualPaths.APPROOT&"library/investigations/"&local.responses.report_number&"/"&local.fileName;
</cfscript>
<cfheader name="content-type" value="application/download">
<cfheader name="Content-Disposition" value="attachment; filename=#local.fileName#">
<cfcontent type="application/download" file="#ExpandPath(local.pathToFile)#" deletefile="No">
<cfreturn true>
</cffunction>
<cffunction name="detachFile" access="remote" >
<cfparam name="request.ID" type="numeric" default="0">
<cfparam name="request.filename" type="string" default="">
<cfscript>
local = structNew();
</cfscript>
<cfinvoke
component="#application.config.CFCOMPONENTS_PREFIX#com.mycompany.request_manager.responseEntity"
method="get"
returnvariable="local.responses">
<cfinvokeargument name="ID" value="#Arguments.ID#"/>
</cfinvoke>
<cfscript>
local.fileName = Arguments.filename;
local.pathToFile = application.virtualPaths.APPROOT&"library/investigations/"&local.responses.report_number&"/"&local.fileName;
</cfscript>
<cffile action="delete" file="#ExpandPath(local.pathToFile)#">
<cfreturn Arguments>
</cffunction>
Тогда на вашем дисплее вы можете сделать что-то вроде этого:
<div>
<h3> Your List of Attached Files For This Report</h3>
Here is file 1. <img src='delete.png' fileName="prebuiltFileNameGoesHere1"><br />
Here is fiel 2. <img src='delete.png' fileName="prebuiltFileNameGoesHere2"><br />
</div>
Затем в js, используя jQuery (добавьте свои собственные инструменты библиотеки, если не используете jQuery):
// Assuming you use jQuery: if not, swap out with your favorite library
$(function() {
// Bind clicks on delete images
$('img.deleteLink').on('click', function(event) {
if(confirm('Are you sure want to remove this attachment?') {
detachThisFile(this.getAttribute('fileName'));
});
}
});
function detachThisFile(filename) {
$.ajax({
url : 'pathtocomponent.ManageAttachment.cfc',
cache : false,
success : function( result, textStatus, jqXHR) {
yourCallBackMethod(result);
},
data : {
method: 'detachFile', returnFormat: 'json', argumentCollection: $.toJSON({filename: filename})
}, // You might need the toJSON plug in or rewrite to be simple value
error : function(jqXHR, textStatus, errorThrown) {
console.log('ERROR OC detachThisFilenme(): ' + errorThrown);
}
});
}
function yourCallBackMethod(result) {
// Maybe you hide the link after you delete it or something to let user know it worked
// Pass an id token through to the call back as an overloaded argument so you know which element to delete
// (This is why detachFile returns arguments, so you can overload it in a useful manner)
}
Я не уверен, откуда исходит ваше удостоверение личности. Если вам это нужно по ссылке (это кажется вероятным), добавьте его в качестве другого атрибута и передайте так же, как имя файла...