2009-05-13 6 views
9

Làm thế nào tôi có thể nhận được các tên tập tin của một tập tin trước khi tôi gọiColdFusion: lấy tên của một tập tin trước khi tải lên

<cffile action = "upload"> 

? Tôi có thể lấy tên tệp của tệp tạm thời nhưng không phải tên tệp thực. Trong vùng đất PHP tôi có thể sử dụng $ _FILES superglobal để có được những gì tôi muốn - nhưng theo như tôi có thể nói không có điều đó tồn tại trong ColdFusion.

Tôi có thể lấy tên tệp phía máy khách nhưng thực sự muốn thực hiện phía máy chủ này.

Cảm ơn

+7

Làm thế nào đột xuất đặc trưng của ColdFusion không có chức năng cơ bản như vậy. – Teekin

Trả lời

7

Tôi không biết một cách để tìm hiểu trước khi gọi cffile, nhưng có thể có một cách giải quyết.

Khi bạn gọi <cffile action="upload">, bạn có thể chỉ định kết quả bằng cách sử dụng result="variable". Vì vậy, hãy gọi tải lên với đích đến dưới dạng tệp tạm thời. Biến kết quả của bạn là một cấu trúc chứa thành viên clientFile, đó là tên của tệp trên máy tính của khách hàng.

Bây giờ, bạn có thể sử dụng <cffile action="move"> để làm bất cứ điều gì bạn cần làm với tên tệp gốc.

+0

Cảm ơn câu trả lời ... Chúng tôi xem giải pháp này vì nó có vẻ là cách duy nhất. Tôi sẽ để câu hỏi này mở ra cho dù có thêm câu trả lời ... Nhưng tôi không nghĩ rằng chúng ta có thể tốt hơn nhiều sau đó những gì bạn đăng tải. – nlaq

+0

Điều này gây ra vấn đề khi bạn thực hiện nhiều yêu cầu ** tải lên tệp ** liên tiếp –

-1

Nếu bạn có thuộc tính tên được xác định trên điều khiển nhập, tên tệp sẽ nằm trong phạm vi MẪU. Ví dụ:

<cfif not structIsEmpty(form)> 
    <cfdump var="#form#"> 
<cfelse> 
    <html> 
    <head> 
     <title>Title</title> 
    </head> 
    <body> 
     <form method="POST" action="#cgi.SCRIPT_NAME#"> 
      <input type="file" name="fileIn" /> 
      <input type="Submit" name="formSubmit"> 
     </form> 
    </body> 
    </html> 
</cfif> 
+1

Cung cấp cho chúng tôi tên tệp tmp, mà chúng tôi không muốn ... – nlaq

+0

Rất tiếc, tôi đã tắt mã hóa. Bây giờ để mod bản thân mình xuống. –

0

Một lựa chọn khác có thể là để có mã client-side cư một trường mẫu ẩn với tên tập tin, sau đó bạn sẽ phải server-side.

Câu trả lời của Ben Doom thường là cách tôi tiếp cận nó.

+0

Vâng, chúng tôi cũng xem xét điều này. Nhưng bạn không thể tin tưởng vào người dùng của bạn không sử dụng FireBug khốc liệt để làm cho cuộc sống của bạn khốn khổ. Tôi cho rằng bạn có thể khởi động lại yêu cầu và gắn cờ người dùng nếu bạn thấy rằng khách hàng var đã nói dối (một khi bạn thực hiện việc tải lên và lấy tên tệp thực) ... Nhưng tôi muốn một giải pháp sang trọng hơn. Cảm ơn câu trả lời mặc dù :) – nlaq

1

Đây là cách chúng tôi thực hiện. Về cơ bản, có một trường tập tin và một trường chuỗi. JavaScript lấy tên tệp từ trình duyệt trước khi biểu mẫu được gửi. Rõ ràng, bạn cần phải xác minh rằng tên tệp ở đầu kia thực sự hiện diện (nó sẽ trống nếu người dùng đã tắt JavaScript) và bạn sẽ cần phải phân tích cú pháp chuỗi để xử lý các khác biệt nền tảng (/users/bob/file.jpg so với C:\Documents and Settings\bob\file.jpg)

<script> 
    function WriteClientFileName(){ 
     $('ClientFileName').value = $('ClientFile').value; 
    } 
</script> 

<form enctype="multipart/form-data" onsubmit="WriteClientFileName();"> 

    <input type="File" name="ClientFile" id="ClientFile"> 
    <input type="hidden" name="ClientFileName" id="ClientFileName" value=""> 

    <input type="submit"> 
</form> 

Ngẫu nhiên, kỹ thuật này là ngôn ngữ chéo. Nó sẽ hoạt động tốt như nhau trong RoR, PHP, JSP, v.v.

Chỉnh sửa: Nếu người dùng "đang sử dụng FireBug khốc liệt" có vấn đề gì? Ngay cả khi họ không có Firebug, họ vẫn có thể đổi tên tệp trên đầu của họ và thay đổi đầu vào. Ngoài ra, bạn đang xác thực các yếu tố đầu vào của mình, phải không?

-1

Không có cách nào để biết tên tệp cho các tệp đã tải lên trước khi lưu vào máy chủ trong ColdFuson, Railo hoặc OpenBD. Tôi thường tạo tên tệp mới 'my' bằng hàm createUUID() trước khi lưu tệp.

2

WOW, tôi đã tìm thấy một giải pháp tuyệt vời và dễ dàng! với một chút javascript

Bằng cách này, bạn nhận được tên tệp tạm thời cho tải lên cffile và tệp thực.jpg tên cho cơ sở dữ liệu

<html> 
<head> 
<script type="text/javascript"> 
function PassFileName() 
{ 
document.getElementById("fileName").value=document.getElementById("fileUp").value; 
} 
</script> 
</head> 
<body> 
<form name="form1" method="post" enctype="multipart/form-data" > 
File: <input type="file" name="fileUp" id="fileUp" size="20" onchange="PassFileName()" /> <br /> 
Title: <input type="text" name="Title" id="Title"><br /> 
<input type="hidden" id="fileName" size="20" name="fileName" /> 
<input type="submit" name="submit"> 
</form> 
</body> 
</html> 
6

Tôi đang sử dụng Railo và thấy tên tệp gốc với:

GetPageContext().formScope().getUploadResource('your_file_input_form_name').getName();

có thể làm việc này trên một máy chủ adobe cũng? nó khá tiện dụng nếu bạn muốn đổi tên tệp đã tải lên của bạn bằng cách nào đó và không muốn nó được chuyển qua hai thư mục tạm thời (xem Renaming Files As They Are Uploaded (how CFFILE actually works))

+0

Cảm ơn, tôi cần điều này chính xác. Làm việc như một say mê! – Mattijs

+0

FYI chỉ hoạt động trong Railo chứ không phải Adobe ColdFusion. Xem câu trả lời của tôi về cách thực hiện điều này trong Adobe ColdFusion. –

14

Có điều này là có thể. Bạn có thể sử dụng chức năng này để lấy tên tập tin khách hàng trước khi sử dụng thẻ cffile:

<cffunction name="getClientFileName" returntype="string" output="false" hint=""> 
    <cfargument name="fieldName" required="true" type="string" hint="Name of the Form field" /> 

    <cfset var tmpPartsArray = Form.getPartsArray() /> 

    <cfif IsDefined("tmpPartsArray")> 
     <cfloop array="#tmpPartsArray#" index="local.tmpPart"> 
      <cfif local.tmpPart.isFile() AND local.tmpPart.getName() EQ arguments.fieldName> <!--- ---> 
       <cfreturn local.tmpPart.getFileName() /> 
      </cfif> 
     </cfloop> 
    </cfif> 

    <cfreturn "" /> 
</cffunction> 

Thông tin thêm ở đây: http://www.stillnetstudios.com/get-filename-before-calling-cffile/

+0

Nó hoạt động! Cảm ơn bạn. Có vẻ điên rồ đến mức khó có được một điều cơ bản như vậy ngoài yêu cầu, nhưng đó là cuộc sống của một nhà phát triển CF. –

+0

Chức năng tiện lợi! Cảm ơn. Xác nhận làm việc trong ColdFusion 10. – PhilNicholas