سؤال

لقد قمت بتطبيق RPCService ، RPCServiceasync & RPCServieImpl. عند النقر فوق زر ، سيتم استدعاء خدمة في جانب الخادم وسيتم إحضار البيانات من DB ويتم إنشاء الملف. بمجرد إنشاء الملف ، أحتاج إلى فتح هذا الملف في جانب العميل وأحتاج إلى مطالبة مربع حوار مع خيارات مفتوحة/حفظ. كيف يمكنني تنفيذ جزء الملف هذا. الثابتة والمتنقلة تقترح وسيلة لتنفيذ ر .. رد الرجاء .. شكرا مقدما ....

@Hambend: لا يزال لدي توضيح آخر! .. كيف أسمي طريقة DOGE هذه في Servlet أخرى ، أي في فئة تحميل OnModule ، لدي الكثير من الأدوات في التصميم المنفصل وأحد هذه القطعة الزر؟ تتم استدعاء هذا الزر خدمة RPCServiceImpl ويتم إجراء جميع التلاعب ويتم إنشاء الملف في وظيفة serperate (public int generatefile (اسم السلسلة) ()). كيف تجعل هذه الوظيفة لاستدعاء طريقة DOGE؟ منذ طلب احتياجات DOGE ، يتم تمرير معلمات الاستجابة معها ؟؟ الثابتة والمتنقلة اقترح لي طريقة لاستدعاء هذه الطريقة. شكرا مقدما

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

المحلول

لا تستطيع خدمات RPC الخاصة بـ GWT إلا بإرسال كائنات Java إلى العميل. لإرسال ملف إلى المستخدم ، ستحتاج إلى استخدام Servlet Java غير GWT. إليك بعض التعليمات البرمجية التي استخدمتها من قبل لتقديم صور JPEG من مستودع.

public class ImageServlet extends HttpServlet {
    private final String repository = "/var/images/";

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        String filename = request.getParameter("file");

        // Security: '..' in the filename will let sneaky users access files
        // not in your repository.
        filename = filename.replace("..", "");

        File file = new File(repository + filename);
        if (!file.exists())
            throw new FileNotFoundException(file.getAbsolutePath());

        response.setHeader("Content-Type", "image/jpeg");
        response.setHeader("Content-Length", String.valueOf(file.length()));
        response.setHeader("Content-disposition", "attachment;filename=\"" + filename + "\"");

        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
        BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());
        byte[] buf = new byte[1024];
        while (true) {
            int length = bis.read(buf);
            if (length == -1)
                break;

            bos.write(buf, 0, length);
        }
        bos.flush();
        bos.close();
        bis.close();
    }
}

يجب أن يتسبب "مرفق المحتوى: المرفق" في تنزيل معظم المتصفحات الملف بدلاً من عرضه ، حيث يتخلف اسم الملف إلى كل ما تقدمه. الطريقة التي ستستخدم بها هذا servlet هي جعل المستخدم يتصل بـ RPCService الذي لديك بالفعل ، والذي يحفظ الملف إلى مجلد المستودع. بعد ذلك ، تقوم بربطها أو إعادة توجيهها إلى هذا servlet بعنوان URL مثل http://your.domain.com/fileservlet؟file=myfile.jpg. من الواضح مع هذا الإعداد ، لديك مخاطر أمان حيث يمكن للمستخدمين تنزيل ملفات الآخرين إذا تمكنوا من تخمين أسماء الملفات.

ما قد ترغب في القيام به هو دمج رمز قاعدة البيانات من خدمة RPC الخاصة بك في هذا servlet. ليست هناك حاجة لحفظ الملف في أي مكان على الخادم ، يمكنك أخذ نتائج قاعدة البيانات الخاصة بك وكتابتها في استجابة. مباشرة إلى المستخدم. طالما قمت بتعيين رؤوس المحتوى بشكل صحيح ، فلن يلاحظ المستخدم الفرق.

لا يمكنك استدعاء هذه الطريقة من servlet آخر ، فإن الطريقة الوحيدة لإنشاء متصفح لتنزيلها كملف هي الوصول إليها من خلال طلب HTTP العادي. أولاً ، تعلن servlet في ملف web.xml الخاص بك كما لو كنت خدمة GWT RPC:

<servlet>
    <servlet-name>ImageServlet</servlet-name>
    <servlet-class>
        com.package.ImageServlet
    </servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>ImageServlet</servlet-name>
    <url-pattern>/imageServlet</url-pattern>
</servlet-mapping>

الآن أي HTTP تحصل على طلبات الذهاب إلى http: //your.tomcat.server/webapp/Imageservlet سوف يتم التقاطها بواسطة Pictureservlet.doget (). ثم على جانب العميل ، يمكنك إما إنشاء رابط HTML عادي إلى الملف:

new HTML("<a href='" + GWT.getHostPageBaseURL() + "imageServlet?file=" + filename + "'>download</a>");

...او انت ينبغي كن قادرًا على وضع هذا في ClickHandler (لم أختبره):

Window.Location.assign(GWT.getHostPageBaseURL() + "imageServlet?file=" + filename);

نصائح أخرى

إذا كان الملف نصًا ، فعليك دائمًا العودة إلى كائن مع مجموعة من الأوتار.
إذا ثنائي ، فإن مجرد بايت [] في الفصل سيفعل.

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