2009-03-13 3 views

ответ

14

Если они являются именами файлов, хорошим выбором будет символ, который запрещен именами файлов. Предложения до сих пор включали , | &, которые обычно разрешены в именах файлов и, следовательно, могут приводить к двусмысленности. /, с другой стороны, обычно не разрешается, даже в Windows. Это разрешено в URI, и оно не имеет особого значения в строках запроса.

Пример:

http://someSite/someApp/myUtil.ashx?files=file1.txt|file2.bmp|file3.doc плохо, потому что он может относиться к действительному файлу file1.txt|file2.bmp.

http://someSite/someApp/myUtil.ashx?files=file1.txt/file2.bmp/file3.doc однозначно относится к 3 файлам.

+6

Этот ответ в основном неверен. | символ недействителен в URL-адресах, по официальным спецификациям, и может вызвать различные проблемы, если вы попытаетесь его использовать. Символ & зарезервирован в строках запроса для разделения пар имя/значение. Запятая может быть выбором ОК, но необходимы дополнительные исследования. –

+0

опасно предположить | не допускается в именах файлов. Linux допускает любые символы в именах файлов. но в Windows, да, есть несколько конкретных исключений, которые включают |. –

+4

@DougS: Я объясняю, почему '|' - плохой выбор в отношении имен файлов. Это также может быть плохой выбор в URL-адресах, я даже не претендую на это. Итак, как это делает мой ответ неправильным? – MSalters

-1

Я думаю, что я хотел бы использовать запятые или точки с запятой.

+2

Точка с запятой является допустимой заменой для &, поэтому не является хорошим выбором: «Серия пар разделена амперсандом,« & »или точкой с запятой,«; ». (http://en.wikipedia.org/wiki/Query_string#Structure) – dwynne

4

Я всегда использовал двойные трубы «||». У меня нет никаких хороших доказательств, подтверждающих, почему это хороший выбор, кроме 10 лет веб-программирования, и это никогда не было проблемой.

5

Я рекомендовал бы делать каждый файл, свой собственный параметр запроса, т.е.

myUtil.ashx?file1=file1.txt&file2=file2.bmp&file3=file3.doc 

Таким образом, вы можете просто использовать стандартный разбор запросов и цикл

+0

+1 стандартный способ сделать несколько значений – bobince

6

вам нужно перечислить имена файлов в виде строки ли? Большинство языков принимают массивы в строке запроса, так что вы могли бы написать это нравится

http://someSite/someApp/myUtil.ashx?files[]=file1.txt&files[]=file2.bmp&files[]=file3.doc 

Если это не так, или вы не можете использовать какую-то другую причину, вы должны придерживаться разделителя, который либо не допускается или необычный в имени файла. Pipe (|) является хорошим, иначе вы могли бы urlencode невидимый персонаж, так как они довольно просты в использовании в кодировании, но сложнее фактически включить в имя файла.

Обычно я использую массивы, когда это возможно, и труба иначе.

+0

опасно предположить | не допускается в именах файлов. Linux допускает любые символы в именах файлов. но в Windows, да, есть несколько конкретных исключений, которые включают |. –

0

Я бы основывался на ответе MSalters, говоря, что для обобщения лучший разделитель является недопустимым для элементов в списке. Например, если в вашем списке указаны цены, запятая является плохим разделителем, потому что ее можно путать со значениями. По этой причине, как и большинство этих ответов, я думаю, что хороший разделитель общего назначения, вероятно, «|» поскольку это редко действительное значение. «/», возможно, не самый лучший разделитель, поскольку он действителен для путей иногда. Параметры

19

Имея запрос несколько раз являются законными, и единственным способом, чтобы гарантировать отсутствие проблем при разборе во всех случаях:

http://someSite/someApp/myUtil.ashx?file=file1.txt&file=file2.bmp&file=file3.doc 

точка с запятой ; должна быть URI кодируется, если часть файла (обращенный к %3B), но нет, если он разделяет параметры запроса, которые являются его зарезервированным использованием.

См. Раздел 2.2 от this rfc:

2.2. Зарезервированные символы

Многие URI включают в себя компоненты, состоящие из определенных символов или ограниченные ими. Эти символы называются «зарезервированными», поскольку их использование в компоненте URI ограничено их зарезервированной целью. Если данные для компонента URI будут конфликтовать с зарезервированной целью, тогда конфликтующие данные должны быть экранированы перед формированием URI.

reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | "," 
+0

Ваш ответ, кажется, состоит из двух частей. Не могли бы вы уточнить? – Sean

1

Это одна общая проблема. Как я справился с этим: я создал метод, который принял список строк, а затем нашел символ, который не был ни в одной из строк. (Я сделал это путем простой конкатенации строк, а затем для тестирования различных символов.) Как только символ был найден, объединил все строки вместе, но также добавил строку с символом разделения. Таким образом, в данном вопросе, один пример WUD быть: http://someSite/someApp/myUtil.ashx?files=|file1.txt|file2.bmp|file3.doc и другой WUD быть: http://someSite/someApp/myUtil.ashx?files=,file1.txt,file2.bmp,file3.doc Но так как я на самом деле использовать метод, который гарантирует мой символ-разделитель не в остальных строках, это безопасно. Это была небольшая работа для создания в первый раз, но я использовал ее много раз в различных приложениях.

+0

звучит круто, как насчет размещения здесь кода? – chrisinmtown

 Смежные вопросы

  • Нет связанных вопросов^_^