2010-01-15 31 views
32

Tôi đang viết một tập lệnh tải lên tệp cho tập lệnh cgi dự kiến ​​yêu cầu nhiều phần, chẳng hạn như biểu mẫu trên trang HTML. boundary là mã thông báo duy nhất chú thích nội dung tệp trong phần nội dung yêu cầu. Dưới đây là một nội dung ví dụ:Tạo ranh giới nhiều phần

--BOUNDARY 
Content-Disposition: form-data; name="paramname"; filename="foo.txt" 
Content-Type: text/plain 

... file contents here ... 
--BOUNDARY-- 

boundary không thể có mặt trong nội dung tệp vì lý do hiển nhiên.

Tôi nên làm gì để tạo một đường biên duy nhất? Tôi có nên tạo một chuỗi ngẫu nhiên hay không, kiểm tra xem nó có nằm trong nội dung tệp hay không và nếu có, tạo mới, rửa sạch và lặp lại, cho đến khi tôi có một chuỗi duy nhất không? Hoặc sẽ là một "mã thông báo khá ngẫu nhiên" (nói rằng, sự kết hợp của dấu thời gian, quá trình id, vv) là đủ?

+2

Bạn sử dụng ngôn ngữ lập trình nào? Thông thường một điều như vậy được xử lý bởi một thư viện. –

+0

Tôi đang sử dụng Ruby. Nó sẽ có được trong stdlib, mặc dù, không thể sử dụng đá quý kể từ khi kịch bản nên được runnable trên bất kỳ hệ thống với ruby ​​cài đặt, mà không cần phải cài đặt đá quý. –

Trả lời

0

Nếu bạn cảm thấy hoang tưởng, bạn có thể tạo một ranh giới ngẫu nhiên và tìm kiếm nó trong chuỗi được gửi, nối thêm char ngẫu nhiên khi tìm. Nhưng kinh nghiệm của tôi là bất kỳ chuỗi phi từ điển nào có giá trị 10 hoặc nhiều hơn, vì vậy việc chọn thứ gì đó như --- NGÂN SÁCH --- TUYỆT VỜI --- TUYỆT VỜI --- là hoàn toàn đủ.

+35

Không, không đủ. Bởi vì bạn sẽ không thể gửi mã nguồn chương trình của bạn (hoặc nhận xét này) bằng cách sử dụng chương trình của bạn. – stepancheg

+4

@stepancheg: Có vẻ như bạn đang cảm thấy hoang tưởng, trong trường hợp này sử dụng giải pháp từ đoạn đầu tiên của câu trả lời của tôi. Tuy nhiên, nếu bạn khỏe mạnh về tinh thần, hãy sử dụng 'Nội dung Mã hóa: gzip' và đừng lo lắng về việc người dùng đang cố gắng giúp bạn. –

+0

Đó là trách nhiệm của lập trình viên để tránh các lỗi trong tương lai gần. – BornToCode

46

Nếu bạn sử dụng một cái gì đó ngẫu nhiên đủ giống như một GUID không nên có bất kỳ cần phải săn qua tải trọng để kiểm tra một bí danh của ranh giới. Một cái gì đó như: -

---- = NextPart_3676416B-9AD6-440C-B3C8-FC66DDC7DB45
Tiêu đề: ....

Payload
---- = NextPart_3676416B-9AD6-440C-B3C8- FC66DDC7DB45--

+2

Cảm ơn! Câu trả lời của bạn chỉ tốt như câu trả lời được gắn thẻ, nhưng anh ấy cần đại diện nhiều hơn bạn đã làm;) –

+2

câu trả lời này là tốt hơn vì GUID được thiết kế đặc biệt để trở thành "duy nhất toàn cầu". Khi bạn có thể nhận được một GUID từ một dòng mã tại sao cố gắng để đến với chuỗi hơi ngẫu nhiên của riêng bạn? – Keith

12

Đối với Java guys:

protected String generateBoundary() { 
      StringBuilder buffer = new StringBuilder(); 
      Random rand = new Random(); 
      int count = rand.nextInt(11) + 30; // a random size from 30 to 40 
      for (int i = 0; i < count; i++) { 
      buffer.append(MULTIPART_CHARS[rand.nextInt(MULTIPART_CHARS.length)]); 
      } 
      return buffer.toString(); 
     } 

private final static char[] MULTIPART_CHARS = 
      "-_1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" 
        .toCharArray(); 

Reference url: http://hc.apache.org/httpcomponents-client-ga/httpmime/xref/org/apache/http/entity/mime/MultipartEntity.html

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