2013-10-02 14 views
8

Không thực sự là một câu hỏi ... Chỉ muốn đăng bài này ở đâu đó vì tôi không thể tìm thấy nó ở nơi khác. Bây giờ tôi đã trộn lẫn với nhau một bản demo làm việc tôi nghĩ rằng tôi sẽ chia sẻ. Điều này hoạt động tốt trên các máy chủ Coldfusion và Railo CFML.Tải lên nhiều tệp với jquery và coldfusion cffile

Vấn đề là đối với nhà phát triển CFML là CFFILE không hoạt động với <input type="file" multiple> ... theo truyền thống nếu bạn muốn tải lên 3 tệp và sử dụng CFFILE ở mặt sau, bạn sẽ phải bao gồm 3 đầu vào tệp riêng biệt trang.

Đây là giải pháp của tôi được rút gọn để đơn giản. Nó sử dụng Jquery $ .ajax để thực hiện một số cuộc gọi tới CFFILE và trả về kết quả cho một div trên trang gọi. Im chắc chắn có một cách tốt hơn để làm điều này và mã của tôi có lẽ là một hack hoàn chỉnh nhưng ví dụ dưới đây hoạt động. Hy vọng điều này sẽ giúp một ai đó.

multiFileUpload.cfm 

<!DOCTYPE html> 
<CFPARAM Name="URL.contractID" defualt=""> 
<head> 
<title>Multi File Upload</title> 
<script> 
$(document).ready(function() { 
     $('#submitFrm').on("click", function(e){ 
     e.preventDefault(); 

      //The jquery.each() statement loops through all the files selected by user 
    $.each($('#multiFile')[0].files, function(i, file) { 
      var data = new FormData(); 
       data.append('file-0', file); 
      ajaxUpload(data); 
      }); //end .each statement  

     }); //end submitFrm's click function 

     function ajaxUpload(data){ 
     console.log("ajaxUpload function called"); 
     $.ajax({url: "multiFileUploadAction.cfm", 
     data: data, 
     cache: false, 
     contentType: false, //this is need for this to work with coldfusion 
     processData: false, //this is need for this to work with coldfusion 
     type: 'POST', 
     success: function(returnData){ 
      console.log(returnData); 
          //here is where you would update your calling 
          //page if successfull 
          $("#msgDiv").html($("#msgDiv").html() + "<p>" + returnData + "</p>"); 
      }, 
     error: function(returnData){ 
       console.log(returnData); 
       } 
    }); //end .ajax call 
    } //end ajaxUpload function 
}); //end onDocument ready 
</script> 
<style> 

</style> 
</head> 
<body> 
<form action="multiFileUploadAction.cfm" Method="POST" enctype="multipart/form-data" class="well" id="multiFileFrm"> 
<input type="file" name="multiFile" id="multiFile" multiple /> 
<button class="btn btn-primary" id="submitFrm" >Submit</button> 
<cfoutput> 
    <input type="hidden" Name="contractID" id="contractID" value="#URL.contractID#"> 
</cfoutput> 
</form> 
<div id="msgDiv" style="display:none;"></div> 
</body> 
</html> 

Đây là trang proccessing tôi ... một lần nữa tước xuống đến mức tối thiểu: multiFileUploadAction.cfm

<CFOUTPUT> 
<CFTRY> 
<cffile action="upload" 
      filefield="file-0" 
      destination="#expandpath("\images")#" 
      nameConflict="makeUnique"> 
    <cfcatch> 
    #cfcatch.Message# 
</cfcatch> 
</cftry> 
    <cfcontent reset="true" />Uploaded #cffile.serverFile# 
</CFOUTPUT> 
<!--- 
<cfdump var="#form#"> 
---> 

Thats nó ... trong mã sản xuất của tôi tạo ra một phản ứng JSON trong đó bao gồm tên tệp và đường dẫn tới tệp (vì 'makeUnique' nó có thể khác nhau sau đó được gửi) Tôi cũng xử lý tệp để tạo hình thu nhỏ và gửi tên và đường dẫn của nó quay lại trang gọi. Bằng cách đó trên trang gọi tôi có thể hiển thị một hình thu nhỏ. Hy vọng ai đó thấy điều này hữu ích.

+0

Đây là trang web hỏi đáp. Tôi thậm chí không chắc chắn nếu tôi thấy một [câu hỏi] (http://stackoverflow.com/help/on-topic) ở bất cứ đâu trong bài đăng của bạn. –

+3

Tôi chưa bao giờ có nhu cầu dùng thử, nhưng đoạn thứ hai của bài đăng này không được tài liệu adobe hỗ trợ http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7388.html –

+1

Để ngăn chặn bị đóng, có thể viết lại như một câu hỏi, và sau đó đăng bài ở trên làm câu trả lời. Đó là thông tin tốt, và nó sẽ là một sự xấu hổ cho người đi bộ để đóng chủ đề, nhấn mạnh hơn vào các quy tắc sau đây hơn là tôn trọng nội dung hữu ích. –

Trả lời

0

Đây là giải pháp của tôi cho một vấn đề tương tự mà một người dùng khác có, mà tôi đã giải quyết vẫn đang sử dụng thuộc tính "nhiều" HTML5 để tải tệp lên. Bạn vẫn có thể tải lên biểu mẫu như bình thường, điều này sẽ POST các tệp đa nhiệm tới máy chủ. Thay vì sử dụng các tiện ích tải lên tệp của CF, bạn có thể chỉ cần lặp qua dữ liệu biểu mẫu và thực hiện việc cá nhân tự viết, cung cấp cho bạn toàn quyền kiểm soát chi tiết tệp trong một yêu cầu duy nhất.

ColdFusion handling of HTML5 <input type="file" multiple="multiple" />

0

Đề xuất của tôi với bạn là đăng chúng dưới dạng dataUrl nếu bạn có khả năng bạn có thể gửi nhiều chuỗi cùng một lúc cho bài đăng của mình. Bạn thực sự không cần một biểu mẫu nào cả để đăng hình ảnh dưới dạng chuỗi dữ liệu. Tôi đã làm việc trên một dự án gần đây, nơi tôi đã phải sử dụng angularjs để tạo tệp tải lên. Nếu bạn thậm chí không phải sử dụng một biểu mẫu. Bạn có thể gửi nó dưới dạng một mảng dữ liệu URL và lặp qua chúng trong cfc của bạn. Ngoài ra, bạn có thể sử dụng một thư viện như tải lên jquery hoặc một cái gì đó như thế nếu tương thích ngược là một vấn đề. Nếu bạn quan tâm đến cách thiết lập lặp qua DataURL và lưu chúng vì chúng là hình ảnh, tôi sẽ đăng mã.

Các vấn đề liên quan