2010-01-14 13 views
5

Tôi có tệp tải lên rất đơn giản cho phép người dùng tải lên tệp PDF. Trên một trang khác tôi sau đó tham khảo các tập tin thông qua một thẻ neo. Tuy nhiên, có vẻ như khi người dùng tải lên một tệp có chứa dấu thăng (#), nó sẽ phá vỡ thẻ liên kết. Nó không gây ra bất kỳ loại lỗi Coldfusion, nó chỉ không thể tìm thấy tập tin. Nếu tôi xóa #, nó hoạt động tốt. Tôi chắc chắn có một số nhân vật khác có cùng vấn đề này.Dấu thăng (#) trong tên tệp gây lỗi

Tôi đã thử đặt URLEncodedFormat() xung quanh tên tệp bên trong neo nhưng điều đó không có tác dụng. Điều duy nhất tôi có thể nghĩ đến là đổi tên tệp mỗi lần tệp được tải lên và xóa ký tự "#" (và bất kỳ ký tự "xấu" nào khác).

Đã có giải pháp dễ dàng hơn. Ý tưởng nào?

+0

đổi tên tệp mỗi khi được tải lên và xóa ký tự "#" (và bất kỳ ký tự "xấu" nào khác). yup. – Henry

Trả lời

5

Nếu bạn kiểm soát mã thử upload file chứng thực chuỗi với

IsValid("url",usersFileName) or 
IsValid("regex",usersFileName,"[a-zA-Z0-9]") 

Nếu không, nếu bạn cảm thấy thoải mái với regex tôi sẽ đề nghị một cái gì đó giống như các áp phích trước đó được cho ý kiến ​​về

REReplace(usersfilename,"[^a-zA-Z0-9]","","ALL") 

Những mẫu giả sử bạn sẽ thêm ".pdf" và chỉ cho phép chữ cái và số. Nếu bạn cần gạch dưới hoặc giai đoạn nó sẽ trông như thế này ...

REReplace(usersfilename,"[^a-zA-Z0-9\._]","","ALL") 

Tôi không phải là một guru regex, nếu tôi có một trong những sai tôi chắc chắn nhiều sẽ nhảy vào và chính xác cho tôi :)

+1

Có, chúng tôi làm điều gì đó tương tự như biểu thức sau. Nhưng thay thế các ký tự đã loại bỏ bằng một cái gì đó như "_" để làm cho nó rõ ràng tên tập tin đã bị thay đổi. Nghiêm túc sở thích cá nhân mặc dù :) – Leigh

+0

Đây là một cách tiếp cận khá tốt. Ước gì tôi nghĩ về nó. –

+0

Đây là nhiều hơn hoặc ít hơn những gì tôi làm. Giống như Leigh, tôi thay thế tất cả các ký tự thay thế bằng '_' làm cảnh báo cho người dùng. – ale

0

Dấu hiệu bảng chữ cái không hợp pháp trong tên tệp trên web. Chúng được sử dụng cho mục tiêu neo trong trang:

<a name="target"> 

Vì vậy, nếu bạn có tệp # name.pdf, trình duyệt thực sự đang tìm kiếm tệp "tệp" và neo nội bộ "name.pdf".

Có, bạn sẽ phải đổi tên tệp của mình khi tải lên.

+0

Tôi hiểu rằng tôi sẽ phải đổi tên. Câu hỏi của tôi là giải pháp đơn giản nhất để chăm sóc nhân vật # cũng như bất kỳ thứ gì khác có thể gây ra vấn đề. – Jason

+0

hãy kiểm tra thay thế() hoặc replaceList() – Henry

+1

@Ben - Tôi có thể sai, nhưng tôi không nghĩ bạn "phải" đổi tên. Mã hóa đúng dấu # sẽ hoạt động (ví dụ: tệp% 23.pdf). Nhưng tôi đồng ý rằng đổi tên là lựa chọn tốt hơn ở đây (đặc biệt là độ nhạy của CF đối với #). – Leigh

-1

Có lẽ bạn sẽ phải thay thế # bằng ## để tránh điều này, tôi nghĩ điều này là do # được hiểu là từ khóa Coldfusion.

+2

Không có vấn đề gì trong Coldfusion. Vấn đề là nó đọc nó như một neo được đặt tên trên trang. – Jason

0

Tôi chưa thể nhận xét, nhưng giải pháp của Kevink là tốt trừ khi bạn cần phải duy trì những gì bạn đang thay thế.

Chúng tôi đã chạy vào một trường hợp mà chúng tôi cần đổi tên tệp nhưng tên tệp cần được bảo toàn một phần (yêu cầu của người dùng). Chỉ cần xóa các ký tự đặc biệt không phải là một tùy chọn. Kết quả là chúng tôi phải xử lý từng thay thế riêng lẻ, giống như vậy.

<cfset newName = replace(thisFile, "##", "(pound)", "All")> 
<cfset newName = replace(newName , "&", "(amp)", "All")> 
<cffile action="rename"source = "#ExpandPath("\uploads\#thisFolder#\#thisFile#")#" destination = "#newName#">