سؤال

أواجه مشكلة أثناء محاولة تقديم ملف مضغوط في JSP.

يكون الملف المضغوط دائمًا تالفًا بعد انتهاء التنزيل.لقد جربت عدة طرق مختلفة للقراءة والكتابة، ويبدو أن أياً منها لم يقم بالمهمة.

أعتقد أنه من المحتمل إضافة أحرف ascii في مكان ما حيث سيتم فتح الملف وعرض جميع أسماء الملفات، لكن لا يمكنني استخراج أي ملفات.

إليك أحدث كود لي:

<%@ page import= "java.io.*" %>

<% 
    BufferedReader bufferedReader = null;

    String zipLocation = "C:\\zipfile.zip"; 

    try
    {
        bufferedReader = new BufferedReader(new FileReader(zipLocation));
        response.setContentType("application/zip");
        response.setHeader( "Content-Disposition", "attachment; filename=zipfile.zip" );

        int anInt = 0;
        while((anInt = bufferedReader.read()) != -1)
        {
            out.write(anInt);
        }
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
%>

يحرر:لقد قمت بنقل الكود إلى servlet وما زال لا يعمل.لقد قمت بتغيير الكثير من الأشياء، لذا إليك أحدث كود لا يعمل:

public void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException
{
    try
    {
        String templateLocation = Config.getInstance().getString("Site.templateDirectory");

        response.setContentType("application/zip");
        response.setHeader("Content-Disposition", "attachment; filename=output.zip;");

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        BufferedOutputStream bos = new BufferedOutputStream(baos);
        FileInputStream fis = new FileInputStream(templateLocation);

        int len;
        byte[] buf = new byte[1024];

        while ((len = fis.read(buf)) > 0)
        {
            bos.write(buf, 0, len);
        }

        bos.close();
        PrintWriter pr = response.getWriter();
        pr.write(baos.toString());
        pr.close();
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}

تحرير 2:

هذا هو رمز servlet الذي أعمل عليه بالفعل.شكرا للجميع!

public void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException
{
    try
    {
        String templateLocation = Config.getInstance().getString("Site.templateDirectory");

        response.setContentType("application/zip");
        response.setHeader("Content-Disposition", "attachment; filename=output.zip;");

        BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());
        FileInputStream fis = new FileInputStream(templateLocation);

        int len;
        byte[] buf = new byte[1024];

        while ((len = fis.read(buf)) > 0)
        {
            bos.write(buf, 0, len);
        }

        bos.close();
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}
هل كانت مفيدة؟

المحلول

والبرق هي الملفات الثنائية، وبالتالي لا تصلح للنقلهم كبيانات حرف. كما نص خارج رمز قد تلف الملف.

استخدم سهل والفانيليا بريمج بدلا من JSP.

نصائح أخرى

ووJSP يضيف بيضاء إلى الإخراج. أقترح عليك نقل هذا إلى بريمج.

وبدلا من ذلك، يمكنك إلقاء نظرة على تجريد بيضاء من الناتج التخطيط الاستراتيجي المشترك ، ولكن لست متأكدا من أن ذلك لن يؤثر على الانتاج ZIP نفسها.

والمشكلة في هذا المقتطف المحدد هو على سطرين - لديك سطر فارغ خارج علامات JSP، التي يتم إرسالها إلى المتصفح كما HTML (أي سطر فارغ في مصدر HTML).

كن حذرا جدا لإزالة أي شيء غير موجود في <٪٪>، وخاصة البيضاء (حتى السطر المحطة!)، أو اتباع نصيحة أماكن أخرى، واستخدام بريمج:)

رمز servlet الخاص بك لا يعمل لأنك تقوم بإخراج الدفق الخاص بك إليه response.getWriter(), ، والذي كما أشار آخرون هو ل بيانات الشخصية.أقتبس من Javadoc:

PrintWriter getWriter() throws IOException
إرجاع كائن PrintWriter الذي يمكنه إرسال نص حرفي إلى العميل.يستخدم PrintWriter ترميز الأحرف الذي تم إرجاعه بواسطة getCharacterEncoding()

ليس هذا فحسب، بل إنك لا تكتب حتى مصفوفة البايت إلى ملف Writer, ، أنت تكتب نتائج ByteArrayOutputStream.toString(), ، والذي يقوم أيضًا بتحويل الأحرف ~

تريد استخدام Response.getOutputStream()، مثل:

BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());

ثم اكتب محتويات البايت لملفك إليه.

والقراء وعادة ما تكون للشخصية تيارات إذا كنت أتذكر بشكل صحيح - قد حاولت شيء أكثر على غرار لByteArrayOutputStream؟ أيضا، يمكن أن JSP الواقع أن إفساد الناتج عن غيرهم قد علق.

bufferedReader = new BufferedReader(new FileReader(zipLocation));

بصرف النظر عن مشكلة Servlet/JSP، فإن هذا الخط يفسد بياناتك بنسبة 100% من اليقين.سيحاول تفسير البيانات الثنائية كنص باستخدام تشفير النظام الأساسي الافتراضي، مما يعني أنه يتم استبدال حوالي نصف البايتات الموجودة في الملف بـ "حرف غير معروف".

البايتات والسلاسل ليست نفس الشيء!

وأود أن أقترح أيضا استخدام بريمج عادي وستنظر <لأ href = "https://stackoverflow.com/questions/1017736/jsp-to-serve-a-zip-corrupts-the-file/1017757# 1017757 "> الجواب روبرت مونتيانو في كما الحق، ولكن هل يمكن أن تفعل ذلك في JSP الخاص بك أيضا. المشكلة ليست بيضاء وأضاف، ولكن هذا المتغير الضمني "الخروج" هو مثيل JSPWriter والكاتب هو للحروف، وليس لبايت. محاولة استخدام على response.getOutputStream () وعلى الحق في ذلك، التي يجب أن تعمل. سوف تحصل على استثناء قائلا شخص آخر بالفعل حصلت على OutputStream، ولكن يمكنك تجاهله.

ولكن كما قلت، وذلك باستخدام بريمج سيكون أنظف بكثير.

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