-6ren"> -我正在尝试实现一个 HTML5 输入字段,让用户可以选择多个文件进行上传。我的表格中有以下内容: ... 我可以在浏览器中选择多个文件,然后单击上传,但我不确定如何使用 ColdF-6ren">
gpt4 book ai didi

html - ColdFusion 处理 HTML5 <input type ="file"multiple ="multiple"/>

转载 作者:太空狗 更新时间:2023-10-29 14:11:45 30 4
gpt4 key购买 nike

我正在尝试实现一个 HTML5 输入字段,让用户可以选择多个文件进行上传。我的表格中有以下内容:

<form method="post" enctype="multipart/form-data" action="index.cfm">
<input type="file" name="Images" id="Images" multiple="multiple" accept="image/jpeg, image/gif, image/png, application/zip" />
...

我可以在浏览器中选择多个文件,然后单击上传,但我不确定如何使用 ColdFusion 处理表单发布。我认为以下方法可行,但这只会上传我选择的最后一个文件:

<cfloop list="#attributes.Images#" index="Image">
<cffile
destination = "#ExpandPath(Trim(request.TempFolder))#"
filefield = "Images"
action = "upload"
nameconflict = "MakeUnique"
result = "UploadedTempFile"
>
<cfoutput>#UploadedTempFile.serverFile#<br /></cfoutput>
</cfloop>

有人可以向我解释如何遍历通过我的一个表单字段提交的所有文件,以便我可以单独处理这些文件吗?

最佳答案

在搜索了很多博客文章、遇到了这个问题并阅读了 Adob​​e 的文档之后,似乎一致认为 CF10 不支持“多个”文件上传支持(除非您使用的是 Flash 表单)。问题是,cffile 标记的“uploadall”值可能会上传所有文件,但您不会返回有关这些文件的结果数组。

这是我组合在一起的一个函数,它利用了底层 Java 方法并在 ACF 10 中进行了测试。

<cffunction name="getUploadedFiles" access="public" returntype="struct"
hint="Gets the uploaded files, grouped by the field name">
<cfset var local = {
files = {},
types = "text/plain,text/csv,application/msexcel,application/vnd.ms-excel,application/octet-stream",
tempFiles = form.getTempFiles(),
idx = 0} />

<cfscript>
arrayEach(form.getPartsArray(), function (field) {
var local = {fieldName = field.getName(), destinationFile = ""};

// Make sure the field available in the form is also
// available for the temporary files
if (structKeyExists(tempFiles, fieldName)) {

// Create the files of field array if it doesn't exist
if (!structKeyExists(files, fieldName)) {
files[fieldName] = [];
}

// If only 1 file was uploaded, it won't be an array - so make it one
if (!isArray(tempFiles[fieldName])) {
tempFiles[fieldName] = [tempFiles[fieldName]];
}

// Check that the form part is a file and within our list of valid types
if (field.isFile() && listFindNoCase(types, field.getContentType())) {

// Compile details about the upload
arrayAppend(files[fieldName], {
file = tempFiles[fieldName][++idx],
filePart = field,
filename = field.getFileName(),
filepath = field.getFilePath(),
contentType = field.getContentType(),
tempFile = tempFiles[fieldName][idx].getPath()
});
}
}
});
</cfscript>

<cfreturn local.files />
</cffunction>

在评论之后,这只是遍历所有表单部分、查找文件并创建一个包含一些有用文件详细信息的数组(并根据我的应用程序要求按特定内容类型进行过滤)。

然后,我创建了 uploadFile 函数,它接收 fieldNamedestinationPath 参数。我根据传入的字段获取上传文件的数组,遍历文件以确保目标文件路径不存在(如果存在则使其唯一),然后使用 的内容写入目标文件从临时上传中引用的 java.io.File 对象。

<cffunction name="uploadFile" access="public" returntype="array"
hint="Uploads a file (or multiple files) from the form to the server">
<cfargument name="fieldName" type="string" required="true" />
<cfargument name="destinationPath" type="string" required="true" />

<cfset var local = {files = [], filepaths = [], allFiles = getUploadedFiles()} />

<cfif structKeyExists(local.allFiles, arguments.fieldName)>
<cfset local.files = local.allFiles[arguments.fieldName] />
</cfif>

<cfloop array="#local.files#" index="local.file">
<cfset local.file.destinationFile = arguments.destinationPath & local.file.fileName />

<cfif fileExists(local.file.destinationFile)>
<cfset local.file.destinationFile = listFirst(local.file.destinationFile, ".") & "_#getTickCount()#.csv" />
</cfif>

<cfset fileWrite(local.file.destinationFile, fileRead(local.file.file)) />
<cfset arrayAppend(local.filePaths, local.file.destinationFile) />
</cfloop>

<cfset setActiveFileName(local.filePaths[arrayLen(local.filePaths)]) />

<cfreturn local.filePaths />
</cffunction>

现在我可以完全控制所有正在上传的文件,并且可以处理所需的结果。

关于html - ColdFusion 处理 HTML5 &lt;input type ="file"multiple ="multiple"/>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7338530/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com