0

我有一个带有实用程序的表单来附加文档,它使用 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 文件中添加什么,以便用户得到一个弹出窗口,说你确定要删除。如果用户按下是,附件应该被删除,但用户仍应留在表单上。

4

2 回答 2

1

所以你有一个表格和一个链接。如果用户选择链接,您希望出现警报,如果用户接受,则服务器上的文件将被删除,但用户仍保留在表单上?我的方法是:

  1. iframe在包含删除文件的代码的表单页面上放置一个 1 像素。
  2. 对于您的锚标记,将其链接到 javascript,以便您可以使用确认弹出窗口。
  3. 在删除文件的页面中,添加一些额外的代码,这些代码使用 javascript 来处理表单页面上的链接。您可以完全摆脱它,或者用声明文件已被删除的声明替换它。

请注意,如果您将链接放在<div>.

于 2013-06-06T12:11:43.057 回答
1

如果可以,我会将这两个 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) 
}

我不知道你的身份证是从哪里来的。如果您从链接中需要它(这似乎很可能),请将其作为另一个属性添加并像文件名一样传递它...

于 2013-06-06T15:55:04.203 回答