0

我正在尝试使用 jquery ajax 方法发送文件,但我不知道如何在 Coldfusion 中接收它,将其转换为适当的文件对象,最后将其保存在 Media 文件夹中的服务器上。

有我想要的东西:

var myDocument = $('#fileinput').prop('files');
var formData = new FormData();
formData.append('myDocument', myDocument);

   $.ajax({
        url: "./somePath/file.cfc?method=handleDocument",
        type: "POST", 
        data: formData,
        contentType: false,
        processData: false,
        success: function(result,status,xhr){
            doSomething();
        },
        error: function(xhr,status,error){
            doSomethingElse();
        }
    });

现在,我们在./somePath/file.cfc中尝试获取myDocument对象并保存它:

<cffunction name="handleDocument" access="remote" returnformat="JSON" returntype="string">

        <cfset requestData = GetHttpRequestData()>
        <cfset content = requestData.content>
        <cfset anyExtesion= content.getExtension()>
        <!---There's no such method getExtension(), but I need something like that--->
  
        
        <cffile action="write" file="./Media/myDocument.#anyExtesion#" output="#x.content#"/>
    

       <cfreturn "File is saved in Media folder.">
</cffunction>
4

1 回答 1

0

无需手动解析原始 http 请求数据来提取文件信息。CFFile 为您处理它:

cffile 动作="上传"

单个文件上传需要包含要上传文件的表单字段的名称。为避免对静态值进行硬编码,请将其argument改为 cffunction。使用该result变量以结构形式返回有关上传文件的详细信息(有关可用属性的列表,请参阅CFFile - 用法部分)。

这是一个允许上传 .PNG 或 .JPG 文件的入门示例(任何其他扩展都会引发异常)。如果成功,状态结构将作为 json 返回。

<cfcomponent>   
    <cffunction name="handleDocument" access="remote" returnformat="JSON" output="false">
        <cfargument name="fileFieldName" type="string" required="true">
        
        <!--- demo - only allow JPG files  --->
        <cffile action="upload"
                destination="c:/nonwebaccessbile/path"
                fileField="#arguments.fileFieldName#"               
                nameconflict="MakeUnique" 
                strict="true"
                result="local.result"
                allowedExtensions=".png,.jpg"
        >
        
        <!--- for demo return saved file name  --->
        <cfreturn {
            "fileWasSaved": local.result.fileWasSaved 
            , "serverFile": local.result.serverFile 
        } >
    </cffunction>
</cfcomponent>

JavaScript

var myDocument = $('#fileinput').prop('files');

对 js 代码的一项更正。上面返回一个FileList对象,而不是一个文件。要访问列表中的第一个文件$('#fileinput').prop('files')[0],请改用。

然后由于 cffunction 需要一个字段name ,在 ajax 调用之前将该值附加到FormData对象:

var theFileField = $("#fileinput");
var theFieldName = theFileField.prop("name")
var theFirstFile = theFileField.prop("files")[0];

var formData = new FormData();
formData.append('fileFieldName', theFieldName);
formData.append(theFieldName, theFirstFile);

$.ajax({
    url: "./pathto/file.cfc?method=handleDocument",
    type: "POST", 
    data: formData,
    dataType: "json", 
    contentType: false,
    processData: false
}).done(function(response, status, xhr){
    // do stuff here ... 
}).fail(function(xhr,status,error){
    // do stuff here ... 
});

安全

文件上传可能会给 Web 应用程序带来很大的安全风险。在将任何文件上传投入生产之前,请先阅读如何保护它们。一些不错的资源:

于 2022-02-07T15:36:13.383 回答