Удаление файла в 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. Поставить 1 пиксель iframe на странице формы, которая содержит код для удаления файла.
  2. Для вашего тега привязки сделайте ссылку на javascript, чтобы вы могли использовать всплывающее окно подтверждения.
  3. На странице, которая удаляет файл, добавьте дополнительный код, который использует 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) 
}

Я не уверен, откуда исходит ваше удостоверение личности. Если вам это нужно по ссылке (это кажется вероятным), добавьте его в качестве другого атрибута и передайте так же, как имя файла...

Другие вопросы по тегам