Pregunta

Necesito aceptar una lista de nombres de archivo en una cadena de consulta. es decir:

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

¿Tiene alguna recomendación sobre qué delimitador usar?

¿Fue útil?

Solución

Si son nombres de archivo, una buena opción sería un personaje que no está permitido en los nombres de archivo. Las sugerencias hasta ahora incluyen , | & amp; que generalmente están permitidos en los nombres de archivo y, por lo tanto, pueden generar ambigüedades. / por otro lado generalmente no está permitido, ni siquiera en Windows. Está permitido en los URI y no tiene un significado especial en las cadenas de consulta.

Ejemplo:

http: //someSite/someApp/myUtil.ashx? files = file1.txt | file2.bmp | file3.doc es incorrecto porque puede referirse al archivo válido file1. txt | file2.bmp .

http: //someSite/someApp/myUtil.ashx? files = file1.txt / file2.bmp / ??file3.doc se refiere inequívocamente a 3 archivos.

Otros consejos

Tener parámetros de consulta varias veces es legal, y la única forma de garantizar que no haya problemas de análisis en todos los casos:

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

El punto y coma ; debe estar codificado en URI si forma parte de un nombre de archivo (convertido a % 3B ), pero no si está separando parámetros de consulta, que es su uso reservado.

Consulte la sección 2.2 de este rfc :

  

2.2. Caracteres reservados

     

Los URI incluyen componentes y subcomponentes que están delimitados por      caracteres en el " reservado " conjunto. Estos personajes se llaman      " reservado " porque pueden (o no) definirse como delimitadores por      la sintaxis genérica, por cada sintaxis específica del esquema, o por la      sintaxis específica de implementación del algoritmo de desreferenciación de un URI.      Si los datos de un componente URI entraran en conflicto con un reservado      propósito del personaje como delimitador, entonces los datos en conflicto deben ser      codificado por ciento antes de que se forme el URI.

 reserved    = gen-delims / sub-delims

 gen-delims  = ":" / "/" / "?" / "#" / "[" / "]" / "@"

 sub-delims  = "!" / "<*>quot; / "&" / "'" / "(" / ")"
             / "*" / "+" / "," / ";" / "="

Recomendaría que cada archivo tenga su propio parámetro de consulta, es decir,

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

De esta forma, puede usar el análisis y el bucle de consulta estándar

¿Necesita enumerar los nombres de los archivos como una cadena? La mayoría de los idiomas aceptan matrices en la cadena de consulta para que pueda escribirlo como

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

Si no lo hace, o no puede usarlo por alguna otra razón, debe apegarse a un delimitador que no esté permitido o sea inusual en un nombre de archivo. Pipe (|) es bueno, de lo contrario, podría codificar un carácter invisible ya que son bastante fáciles de usar en la codificación, pero más difíciles de incluir en un nombre de archivo.

Normalmente uso matrices cuando es posible y canalizo de otra manera.

Siempre he usado tubos dobles " || " ;. No tengo ninguna buena evidencia para respaldar por qué esta es una buena opción aparte de los 10 años de programación web y nunca ha sido un problema.

Este es un problema común. Cómo lo manejé fue: creé un método que aceptaba una lista de cadenas, luego encontré un carácter que no estaba en ninguna de las cadenas. (Hice esto mediante una simple concatenación de las cadenas, luego probando varios caracteres.) Una vez que se encontró un carácter, concatenaba todas las cadenas juntas pero también anteponía la cadena con el carácter de separación. Entonces, en la pregunta dada, un ejemplo sería: http: //someSite/someApp/myUtil.ashx? files = | file1.txt | file2.bmp | file3.doc y otro wud será: http: //someSite/someApp/myUtil.ashx? files =, file1.txt, file2.bmp, file3.doc Pero como realmente uso un método que garantiza que mi carácter separador no está en el resto de las cadenas, es seguro. Fue un poco difícil de crear la primera vez, pero lo he usado MUCHAS veces en varias aplicaciones.

Creo que consideraría usar comas o punto y coma.

Me basaría en la respuesta de MSalters diciendo que, para generalizar, el mejor delimitador es uno que no es válido para los elementos de la lista. Por ejemplo, si su lista son precios, una coma es un delimitador incorrecto porque puede confundirse con los valores. Por esa razón, como la mayoría de estas respuestas sugieren, creo que un buen delimitador de propósito general es probablemente '' | '' ya que rara vez es un valor válido. " / " tal vez no sea el mejor delimitador en general, ya que a veces es válido para rutas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top