【问题标题】:send input file with special characters (such as accents) to the web server将带有特殊字符(例如重音符号)的输入文件发送到 Web 服务器
【发布时间】:2019-12-16 16:18:11
【问题描述】:

我正在使用 asp classic 并使用类似 Web 服务器的 IIS。 我必须从 html 网页发送文件(使用输入文件)。 问题是当我在文件名中有特殊字符时。 例如:当文件的名称是“Distribución de tareas para desarrollo.docx”并且名称到达服务器时,如“Distribución de tareas para desarrollo.docx” 这是我的html头代码。

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

我尝试使用 html 代码和 asp 代码中的字符集,但它不起作用。

现在按照用户@Daniel Nordh 的建议添加这些行。

`
 <%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
 <% Response.CodePage = 65001
    Response.CharSet = "UTF-8" 
 %>

` 但是,结果是一样的。

好吧,看来我正面临着严重的问题。 我知道从浏览器发送输入文件时,数据以二进制文件形式到达。 一旦我分离了标题,我就会看到文件到达服务器,它会执行以下操作。

--------------7e33a72830078c 内容处置:表单数据;名称=“文档”; filename="Distribución de tareas para desarrollo.docx" 内容类型:application/vnd.openxmlformats-officedocument.wordprocessingml.document PK

读名字的方式和我得到的一样。

但是如果我在 asp 的同一页面上写下面的代码。

response.write "<br>panificación<br>"

请求页面时显示。 恐慌。

我正在考虑的是我有问题,因为它是作为二进制文件发送的输入文件。

用于发送文件的 HTML 表单。

<form  method="post" action="files.asp" target="_blank" 
  enctype="multipart/form-data">
      <div class="group-form">
		     <div class="input-group">
		            <input accept=".doc,.docx" type="file" name="archivo">
		                  <span class="input-group-addon"  >doc (opcional)</span>
		    </div>
	    </div>
 </form>

这里是处理收到的文件的代码。 变量和 cmets 是西班牙语。

<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<%    
    Response.CodePage = 65001
    Response.CharSet = "UTF-8"
%>    
<%

dim v_recordset
dim v_arreglo_archivos
dim v_archivo 
dim v_bytes
dim v_posicion_limite
dim v_datos_binarios
dim v_longitud_binaria
dim v_agregar_lvc
dim v_datos_completos
dim v_inicio_archivo
dim v_final_archivo
dim v_cadena_delimitadora
dim v_datos_archivo
dim v_inicio_nombre
dim v_fin_nombre
dim v_cadena_nombre_archivo
dim v_pos_temp
dim v_pos_previa
dim v_nombre_archivo
dim v_content_type
dim v_inicio_datos
dim v_fin_datos
dim v_longitud_datos
dim v_file_object
dim v_creador_archivos
dim v_datos_enviados
dim v_cantidad_archivos_subidos
dim v_bandera_archivo_lleno


set v_recordset=CreateObject("ADODB.Recordset")

on error resume next

v_agregar_lvc=201
v_cantidad_archivos_subidos=0


v_bytes=request.totalBytes
v_datos_binarios=request.BinaryRead(v_bytes)
v_longitud_binaria=LenB(v_datos_binarios)

if v_longitud_binaria>0 then
    v_recordset.Fields.Append "mi_binario",v_agregar_lvc,v_longitud_binaria
    v_recordset.Open 
    v_recordset.AddNew
    v_recordset("mi_binario").AppendChunk v_datos_binarios
    v_recordset.Update 
    v_datos_completos=v_recordset("mi_binario")
end if

v_encabezado=request.ServerVariables("HTTP_CONTENT_TYPE")
v_posicion_limite=instr(1,v_encabezado,"boundary=") + 8

 v_cadena_delimitadora= right(v_encabezado,len(v_encabezado)- v_posicion_limite)  

v_cadena_delimitadora="--" &v_cadena_delimitadora 

v_inicio_archivo=instr(1,v_datos_completos,v_cadena_delimitadora)



 v_final_archivo=instr(v_inicio_archivo+1,v_datos_completos,
 v_cadena_delimitadora)-1




  do while v_final_archivo>0



    v_datos_archivo=mid(v_datos_completos,v_inicio_archivo,v_final_archivo - 
    v_inicio_archivo)

    v_inicio_nombre=instr(1,v_datos_archivo,"filename=")+10
    v_fin_nombre=instr(v_inicio_nombre,v_datos_archivo,chr(34))

    v_datos_completos=replace(v_datos_completos,v_datos_archivo,"")


    if v_inicio_nombre=v_fin_nombre then


        v_bandera_archivo_lleno=false

        do while not v_bandera_archivo_lleno

           v_inicio_archivo=instr(1,v_datos_completos,
                            v_cadena_delimitadora)
           v_final_archivo=instr(v_inicio_archivo+1,v_datos_completos,
                            v_cadena_delimitadora)-1    

           v_datos_archivo=mid(v_datos_completos,v_inicio_archivo,
                           v_final_archivo - v_inicio_archivo)

           v_inicio_nombre=instr(1,v_datos_archivo,"filename=")+10
           v_fin_nombre=instr(v_inicio_nombre,v_datos_archivo,chr(34))



            if v_inicio_nombre<>v_fin_nombre then
                v_bandera_archivo_lleno=true
            end if

            v_datos_completos=replace(v_datos_completos,v_datos_archivo,"")

        loop    

    end if





     if v_inicio_nombre<>v_fin_nombre then



     v_cadena_nombre_archivo=mid(v_datos_archivo,v_inicio_nombre,
                                v_fin_nombre - v_inicio_nombre)
     v_pos_temp=instr(1,v_cadena_nombre_archivo,"\")

        do while v_pos_temp>0

            v_pos_previa=v_pos_temp
            v_pos_temp=instr(v_pos_previa+1,v_cadena_nombre_archivo,"\")
        loop

        v_nombre_archivo=right(v_cadena_nombre_archivo,
                        len(v_cadena_nombre_archivo) - v_pos_temp)

        v_content_type=instr(1,v_datos_archivo,"Content-type:")


        if v_content_type>0 then
        v_inicio_datos=instr(v_content_type,v_datos_archivo,chr(13)&chr(10)) 
                        + 4
        else
            v_inicio_datos=v_fin_nombre
        end if

        v_fin_datos=len(v_datos_archivo)


        v_longitud_datos=v_fin_datos - v_inicio_datos
        v_datos_enviados=mid(v_datos_archivo,v_inicio_datos,v_fin_datos)


    end if

    v_inicio_archivo=instr(1,v_datos_completos,v_cadena_delimitadora)
    v_final_archivo=instr(v_inicio_archivo+1,v_datos_completos,
                    v_cadena_delimitadora)-1

loop

好的。获取内容后,将其保存在服务器上。但那是其他不会给我带来麻烦的事情。

【问题讨论】:

    标签: html iis asp-classic


    【解决方案1】:

    确保您也将文件保存为 UTF-8。尝试将此添加到您正在使用的页面的最顶部。根据我自己的经验,编码和 ASP Classic 可能是一场噩梦。

    <%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
    <%
    response.codepage = 65001
    response.charset = "utf-8"
    %>
    

    【讨论】:

    • 感谢 cmets。我输入了你告诉我的行并将文件保存为 utf-8 编码,但我得到了相同的结果。
    • 将文件发送到服务器的代码是什么?顺便说一句,作为一项规则,我尝试将文件名保留为 [a-z][0-9]、“-”和“_”。我想现在这不是一个问题,但在过去,使用其中包含其他符号的文件会更成问题。
    • 文件是由外部用户上传的,因为它是一个网络系统。我们建议不带重音也不带空格,但总有用户不遵循建议。将文件发送到服务器的代码?如果这就是你的意思,它是一个 html 表单。
    • 我不是正则表达式专家,但您可以将名称限制为一组特定的字符,除非命名正确,否则无法发送它们。是的,查看表单和发送中可能涉及的任何脚本可能很有用。另外,它是否通过帮助文件发送?我倾向于将页面的功能保存在单独的文件中。两者都必须使用上面的代码才能正常工作。
    • 我宁愿避免从 javascript 更改名称。但如果没有其他选择,我将不得不这样做。
    猜你喜欢
    • 2014-06-13
    • 2011-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多