سؤال

لقد تم كتابة القليل من التطبيقات التي تتيح الناس تحميل الملفات لي.لقد تم إضافة خدمة ويب إلى هذا applciation لتوفير تحميل/تحميل وظائف بهذه الطريقة ولكن أنا لست متأكدا على مدى تنفيذ بلدي هو ذاهب للتعامل مع الملفات الكبيرة.

في هذه اللحظة تعاريف تحميل أساليب تبدو مثل هذا (مكتوبة باستخدام أباتشي CXF):

boolean uploadFile(@WebParam(name = "username") String username,
    @WebParam(name = "password") String password,
    @WebParam(name = "filename") String filename,
    @WebParam(name = "fileContents") byte[] fileContents)
    throws UploadException, LoginException;

byte[] downloadFile(@WebParam(name = "username") String username,
    @WebParam(name = "password") String password,
    @WebParam(name = "filename") String filename) throws DownloadException,
    LoginException;

حتى يحصل على ملف تحميلها كما صفيف بايت.ولكن إذا كان لدي ملف غبية الحجم (مثلا ، 1GB) بالتأكيد هذا سوف نحاول وضع كل تلك المعلومات في الذاكرة و تحطم خدمة بلدي.

لذا سؤالي هو: - هل من الممكن أن يعود بعض نوع من تيار بدلا من ذلك ؟ أتصور أن هذا لن يكون رهيب OS مستقلة على الرغم من.على الرغم من أنني أعرف النظرية وراء خدمات ويب الجانب العملي هو شيء أن كنت لا تزال بحاجة لالتقاط قليلا من المعلومات.

هتافات أي مساهمة ، لي

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

المحلول

ستيفن Denne وقد مترو التنفيذ التي تلبي الاحتياجات الخاصة بك.جوابي هو المخصص أدناه بعد فترة قصيرة explination لماذا هذا هو الحال.

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

إذا كنت ترغب في الحفاظ على هذا يمكن أن توفر التقسيم.

boolean uploadFile(String username, String password, String fileName, int currentChunk, int totalChunks, byte[] chunk);

وهذا يتطلب بعض في الملعب في الحالات التي لا تحصل على قطع في حق النظام (أو يمكنك فقط تتطلب قطع يأتي في الترتيب الصحيح) ، إلا أنه قد يكون من السهل جدا لتنفيذ.

نصائح أخرى

نعم ، فمن الممكن مع المترو.ترى المرفقات الكبيرة على سبيل المثال ، والذي يبدو أنه يفعل ما تريد.

جاكس-WS ري تدعم إرسال واستقبال مرفقات كبيرة في تدفق الموضة.

  • استخدام MTOM و DataHandler في نموذج البرمجة.
  • يلقي DataHandler إلى StreamingDataHandler واستخدام الأساليب.
  • تأكد من الاتصال StreamingDataHandler.close() و أيضا إغلاق StreamingDataHandler.readOnce() تيار.
  • تمكين HTTP chunking على جانب العميل.

عند استخدام موحدة خدمة ويب المرسل و المتلقي لا تعتمد على سلامة بيانات XML ترسل من واحدة إلى أخرى.وهذا يعني أن خدمة ويب طلب الإجابة فقط كاملة عندما الوسم الأخير تم إرسالها.وبعد هذا في الاعتبار, خدمة ويب لا يمكن أن تعامل على أنها تيار.

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

آسف جدا, ولكن بقدر ما أستطيع أن أرى أن هناك أي إمكانية الجري في خدمات الويب.حتى أسوأ من ذلك:اعتمادا على التنفيذ/تكوين خدمة ويب ، byte[] - قد تكون البيانات المترجمة إلى Base64 وليس CDATA-العلامة الطلب قد تحصل على أكثر المتضخمة.

P. S.:نعم, وغيرها من كتب "chuinking" هو ممكن.ولكن هذا لا يتدفقون على هذا النحو؛ -) - على أية حال ، قد تساعدك.

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

هل سبق لك أن لاحظت في المتصفح أنه في بعض الأحيان يمكن أن يستغرق بعض الوقت لجلب صفحة المتصفح فقط يستمر التحريك بعيدا تظهر الساعة الرملية ؟ وذلك لأن المتصفح ينتظر على تيار.

تيارات هي السبب mime/أنواع ليتم إرسالها من قبل البيانات الفعلية - انها مجرد تيار بايت إلى المتصفح, فإنه لن يكون قادرا على تحديد صورة إذا لم اقول انه ما كان أولا.وهو أيضا السبب لديك لتمرير حجم الثنائية قبل إرسال - المتصفح لن تكون قادرة على معرفة أين صورة توقف الصفحة تلتقط مرة أخرى.

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

أن الكثير من الناس لا يعرفون ان كل هذه الاشياء هو تيار بناء يظهر فقط كيف الكثير من الأشياء وقد الطبقات على أعلى من ذلك.البعض قد يقول الكثير من الأشياء - أنا واحد من هؤلاء.

حظا سعيدا التنمية الاسترخاء تلك الكتفين!

بالنسبة WCF أعتقد أن من الممكن تعريف الأعضاء على رسالة تيار وتعيين ملزمة بشكل مناسب - لقد رأيت هذا العمل مع wcf الحديث جافا خدمة ويب.

تحتاج إلى تعيين transferMode="StreamedResponse" في httpTransport التكوين و استخدام mtomMessageEncoding (تحتاج إلى استخدام العرف ملزم القسم في التكوين).

أعتقد حد واحد هو أنه يمكنك فقط رسالة واحدة الجسم العضو إذا كنت تريد أن تيار (وهو نوع من المنطقي).

أباتشي CXF يدعم إرسال واستقبال تيارات.

طريقة واحدة للقيام بذلك هو أن إضافة uploadFileChunk(byte[] chunkData, int size, int تعويض الباحث totalSize) الأسلوب (أو شيء من هذا القبيل) أن بتحميل أجزاء من الملف خوادم يكتب ذلك إلى القرص.

نضع في اعتبارنا أن طلب خدمة ويب في الأساس يتلخص واحد HTTP POST.

إذا نظرتم إلى الإخراج .الملف ASMX في .صافي ، فإنه يظهر لك بالضبط ما طلب POST والاستجابة سوف تبدو مثل.

Chunking ، كما ذكر من قبل @Guvante, سيكون أقرب شيء إلى ما تريد.

أنا افترض أنك يمكن أن تنفذ الويب الخاص بك رمز العميل على التعامل مع بروتوكول TCP/IP و تيار الأمور في التطبيق الخاص بك, ولكن من شأنها أن تكون معقدة على أقل تقدير.

أعتقد أن استخدام بسيط بريمج هذه المهمة ستكون أسهل بكثير النهج ، أو هل هناك أي سبب لا يمكنك استخدام بريمج?

فعلى سبيل المثال يمكن استخدام المشاع مكتبة مفتوحة المصدر.

على RMIIO مكتبة جافا ينص على تسليم مجموعة RemoteInputStream عبر RMI - نحن بحاجة فقط RMI, على الرغم من أنك يجب أن تكون قادرة على التكيف مع رمز للعمل على أنواع أخرى من جزر مارشال .قد يكون هذا عونا لك - خاصة إذا كنت يمكن أن يكون تطبيق صغير على الجانب المستخدم.المكتبة وضعت بغرض التمكن من الحد من حجم البيانات دفعت إلى الخادم لتجنب بالضبط نوع من الحالة يمكنك أن تصف فعالية هجوم حجب الخدمة عن طريق ملء القرص أو ذاكرة الوصول العشوائي.

مع RMIIO مكتبة جانب الملقم يحصل أن تقرر كم البيانات هو على استعداد لسحب, حيث مع HTTP وضع المشاركات العميل يحصل على اتخاذ هذا القرار ، بما في ذلك المعدل الذي يدفع.

نعم, خدمة ويب يمكن أن تفعل الجري.أنا خلقت خدمة ويب باستخدام أباتشي Axis2 و MTOM لدعم تقديم وثائق PDF من XML.منذ الملفات الناتجة يمكن أن تكون كبيرة جدا ، يتدفقون كان مهما لأننا لم نكن نريد أن نضع كل شيء في الذاكرة.نلقي نظرة على أوراكل الوثائق على تدفق الصابون المرفقات.

بالتناوب, يمكنك أن تفعل ذلك بنفسك ، و هر سيتم إنشاء المقسم رؤوس.هذا هو مثال على الربيع وظيفة المراقب المالي أن تيارات.

 @RequestMapping(value = "/stream")
        public void hellostreamer(HttpServletRequest request, HttpServletResponse response) throws CopyStreamException, IOException  
{

            response.setContentType("text/xml");
            OutputStreamWriter writer = new OutputStreamWriter (response.getOutputStream());
            writer.write("this is streaming");
            writer.close();

    }

في الواقع ليس من الصعب أن "التعامل مع TCP/IP و تيار الأمور في التطبيق الخاص بك".جرب هذا...

class MyServlet extends HttpServlet
{
    public void doGet(HttpServletRequest request, HttpServletResponse response)
    {
        response.getOutputStream().println("Hello World!");
    }
}

وهذا هو كل ما في الأمر.لديك في التعليمات البرمجية أعلاه ، استجاب إلى طلب HTTP GET المرسلة من المتصفح ، وعاد إلى هذا المتصفح النص "مرحبا العالم!".

نضع في اعتبارنا أن "مرحبا العالم!" ليست صالحة HTML, لذلك كنت قد ينتهي مع خطأ على المتصفح, ولكن هذا هو حقا كل ما في الأمر.

حظا سعيدا في تطوير الخاص بك!

رودني

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