使用Web应用程序巨大的文件上传(Upload of huge file using a web a

2019-09-22 15:17发布

对于给定的目标环境不currenly可用,因此,我不能尝试的东西,都要靠只分析!

我的目标可以分为以下不同的步骤:

  1. 用一个愚蠢的“上传文件”上传大文件(高达100GB)页-没有从这个逃生的用户希望(哑)前端和不愿意到FTP文件等。
  2. Web应用程序提供上述前端将低端机器上托管 - 2GB内存和40GB硬盘和此Web应用程序将不会保存大文件的任何部分在本地计算机上,但必须“迅速”将其写入高端远程Linux机器

对于每一步,我强调我的做法,关注和疑问:

  • 我提到这个线程,其困惑我,因为我正打算创建一个使用Spring MVC的带有上传页面哑Web应用程序-我需要进入HTML5等,或者一个简单的Web应用程序就足够了?

  • 考虑到2GB内存,Web应用程序会比它1GB获得较少。 恐怕一个“OutOfMemoryError异常”是可能的,如果代码不严格写 - 我必须确保从流,一小块,说10MB必须一次读取和写入远程Linux机器的文件。 假设我在控制器Servlet的doPost方法(...),我做了一些阅读有关如何进行,得到了困惑:

      /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse * response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub InputStream fis = request.getInputStream(); int i = 0; /* Approach - 1 : Plain old byte-by-byte method */ Socket socket = new Socket("192.168.90.20", 22); OutputStream remoteOpStream = socket.getOutputStream(); while ((i = fis.read()) != -1) { remoteOpStream.write(i); } /* clean-up */ /* Approach - 2 : NIO */ ByteBuffer byteBuff = ByteBuffer.allocate(10000);/* read 10MB of data */ ReadableByteChannel rdbyc = Channels.newChannel(request .getInputStream()); File remoteFile = new File("192.168.90.20/Remote_Linux_Folder");/* * Dunno * how * to * create * a * File * on a * remote * Linux * machine */ FileOutputStream remoteFos = new FileOutputStream(remoteFile); FileChannel writableChannel = remoteFos.getChannel(); while (true/* dunno how to loop till all the data is read! */) { rdbyc.read(byteBuff); writableChannel.write(byteBuff); } /* clean-up */ } 

我需要一些方法,其中,所述本地计算机上的数据存储是最小的-代码简单地读取来自输入流的n个字节,并写入同一到远程计算机

我相信NIO是要走的路 ,但我不能确定,我怎么着手进行-请指导差不多。

Answer 1:

我想实现一个FixedSizeQueue和popAll()将数据从QueueStream到另一台计算机的。 也许有它双缓冲,只提供网络/带宽问题的缓冲。



文章来源: Upload of huge file using a web application