سؤال

لقد نفذت بسيطة تحميل الملفات-تحميل آلية.عندما ينقر المستخدم على اسم ملف ، تحميل الملف مع هذه رؤوس HTTP:

HTTP/1.1 200 OK
Date: Tue, 30 Sep 2008 14:00:39 GMT
Server: Microsoft-IIS/6.0
Content-Disposition: attachment; filename=filename.doc;
Content-Type: application/octet-stream
Content-Length: 10754

أنا أيضا الدعم الياباني أسماء الملفات.من أجل القيام بذلك, أنا ترميز اسم الملف مع طريقة جافا:

private String encodeFileName(String name) throws Exception{
    String agent = request.getHeader("USER-AGENT");
    if(agent != null && agent.indexOf("MSIE") != -1){ // is IE
        StringBuffer res = new StringBuffer();
        char[] chArr = name.toCharArray();
        for(int j = 0; j < chArr.length; j++){
            if(chArr[j] < 128){ // plain ASCII char
                if (chArr[j] == '.' && j != name.lastIndexOf("."))
                    res.append("%2E");
                else
                    res.append(chArr[j]);
            }
            else{ // non-ASCII char
                byte[] byteArr = name.substring(j, j + 1).getBytes("UTF8");
                for(int i = 0; i < byteArr.length; i++){
                    // byte must be converted to unsigned int
                    res.append("%").append(Integer.toHexString((byteArr[i]) & 0xFF));
                }
            }
        }
        return res.toString();
    }
    // Firefox/Mozilla
    return MimeUtility.encodeText(name, "UTF8", "B");
}

انها عملت بشكل جيد حتى الآن, حتى شخص تبين أنه لا يعمل بشكل جيد مع أسماء الملفات الطويلة.على سبيل المثال: あああああああああああああああ2008.10.1あ.doc.إذا قمت بتغيير واحد من بايت واحد من النقاط إلى بايت واحد يؤكد أو إذا قمت بإزالة الحرف الأول ، فإنه يعمل على ما يرام.أي أنه يعتمد على طول URL ترميز نقطة حرف.وفيما يلي أمثلة قليلة.

هذا هو كسر (あああああああああああああああ2008.10.1あ.doc):

Content-Disposition: attachment; filename=%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%822008%2E10%2E1%e3%81%82.doc;

هذا هو موافق (あああああああああああああああ2008_10.1あ.doc):

Content-Disposition: attachment; filename=%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%822008_10%2E1%e3%81%82.doc;

هذا هو أيضا غرامة (あああああああああああああああ2008.10.1あ.doc):

Content-Disposition: attachment; filename=%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%822008%2E10%2E1%e3%81%82.doc;

أي شخص عنده فكرة ؟

هل كانت مفيدة؟

المحلول

gmail مقابض اسم الملف الهروب بشكل مختلف إلى حد ما:اسم الملف ونقلت (انقر نقرا مزدوجا الاقتباس) و بايت واحد فترات ليست URL هرب.هذه الطريقة ، اسم ملف طويل في السؤال هو موافق.

Content-Disposition: attachment; filename="%E3%81%82%E3%81%82%E3%81%82%E3%81%82%E3%81%82%E3%81%82%E3%81%82%E3%81%82%E3%81%82%E3%81%82%E3%81%82%E3%81%82%E3%81%82%E3%81%82%E3%81%822008.10.1%E3%81%82.doc"

ومع ذلك ، لا تزال هناك قيود (على ما يبدو IE فقط) على بايت طول اسم الملف (علة ، أفترض).حتى إذا كان اسم الملف مصنوعة فقط من بايت واحد الشخصيات ، بداية اسم الملف يتم اقتطاع.الحد حوالي 160 بايت.

نصائح أخرى

كما ذكر أعلاه, ترتيب المحتوى Unicode من المستحيل الحصول على العمل في جميع المتصفحات الرئيسية دون متصفح استنشاق وإعادة رؤوس مختلفة لكل منها.

الحل كان لتجنب رأس المحتوى الترتيب تماما ، و إلحاق اسم الملف إلى نهاية عنوان URL إلى خداع المتصفح إلى التفكير كان الحصول على الملف مباشرة.على سبيل المثال

http://www.xyz.com/cgi-bin/dynamic.php/あああああああああああああああ2008.10.1あ.doc

وهذا بطبيعة الحال يفترض أن تعرف اسم الملف عند إنشاء رابط, على الرغم سريعة توجيه رأس يمكن تعيين على الطلب.

القضية الرئيسية هنا هي أن IE لا يدعم ذات الصلة RFC, هنا:RFC2231.انظر مؤشرات حالات الاختبار.وعلاوة على ذلك فإن الحل الذي كنت تستخدم IE (فقط باستخدام المئة-هرب UTF-8) له عدة مشاكل إضافية;فإنه قد لا تعمل في كافة اللغات (بقدر ما أذكر طريقة يفشل في كوريا إلا إذا أي تكوين دائما استخدام UTF-8 في عناوين المواقع التي لا الافتراضي) ، وكما ذكر سابقا ، هناك طول حدود (سمعت أن أن هو ثابت في IE8 ، ولكن أنا لم أحاول حتى الآن).

أعتقد تم إصلاح هذه المشكلة في IE8 ، لقد رأيت ذلك يعمل في IE 8.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top