Tôi có một servlet cần ghi ra các tệp có tên có thể định cấu hình người dùng. Tôi đang cố gắng sử dụng mã hóa URI để thoát khỏi các ký tự đặc biệt đúng cách, nhưng JRE dường như tự động chuyển đổi các dấu gạch chéo được mã hóa %2F
thành các dấu tách đường dẫn.Tại sao Java tự động giải mã% 2F trong tên tệp được mã hóa URI?
Ví dụ:
File dir = new File("C:\Documents and Setting\username\temp");
String fn = "Top 1/2.pdf";
URI uri = new URI(dir.toURI().toASCIIString() + URLEncoder.encoder(fn, "ASCII").toString());
File out = new File(uri);
System.out.println(dir.toURI().toASCIIString());
System.out.println(URLEncoder.encode(fn, "ASCII").toString());
System.out.println(uri.toASCIIString());
System.out.println(output.toURI().toASCIIString());
Đầu ra là:
file:/C:/Documents%20and%20Settings/username/temp/
Top+1%2F2.pdf
file:/C:/Documents%20and%20Settings/username/temp/Top+1%2F2.pdf
file:/C:/Documents%20and%20Settings/username/temp/Top+1/2.pdf
Sau khi các đối tượng tập tin mới được khởi tạo, trình tự %2F
được tự động chuyển thành một dấu gạch chéo và tôi kết thúc với một con đường không chính xác . Có ai biết cách thích hợp để tiếp cận vấn đề này?
Cốt lõi của vấn đề dường như là
uri.equals(new File(uri).toURI()) == FALSE
khi có một %2F
trong URI.
Tôi đang lập kế hoạch để chỉ sử dụng chuỗi URL được mã hóa đúng nguyên văn chứ không phải cố gắng sử dụng hàm tạo File(uri)
.
Đó chắc chắn đúng để làm như vậy. Nếu bạn cần một nguyên văn '% 2F' trong tên tệp hơn nó phải được thoát đúng khi được sử dụng trong một URI:'% 252F' – Joey
Tôi nghĩ bạn hiểu lầm. Tôi không muốn mã hóa '% 2F', tôi muốn mã hóa '/' để tôi có thể tạo tên tệp hợp pháp đại diện cho tên do người dùng chỉ định chứa dấu gạch chéo chuyển tiếp. – Lucas
Không quan tâm: Tôi biết đây là các URI tệp, nhưng nếu chúng là các URI http thì máy chủ web không xử lý '% F2' và'/'giống nhau? Ngoài ra: Vì '/' không hợp lệ trong một tên tệp cửa sổ, nên một tệp URI dường như không có ý nghĩa, hoặc? – RoToRa