java - 使用网络应用程序上传大文件

标签 java file-upload file-io nio bulk

给定目标的环境当前不可用,因此,我无法尝试,只能依赖分析!

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

  1. 使用愚蠢的“上传文件”页面上传巨大文件(高达100GB) - 无法避免这种情况,因为用户想要一个(愚蠢的)前端并且不愿意通过 ftp 传输文件文件等
  2. 提供上述前端的 Web 应用程序将托管在低端计算机上 - 2GB RAM 和 40GB HDD,并且此 Web 应用程序不会在本地计算机上存储大文件的任何部分,但必须“快速”写入它到高端远程 Linux 机器

对于每一步,我都会强调我的方法、担忧和疑问:

  • 我提到了this这个线程让我很困惑,因为我计划使用 Spring MVC 和上传页面创建一个愚蠢的 Web 应用程序 - 我是否需要进入 HTML5 等,或者一个简单的 Web 应用程序就足够了?

  • 考虑到 2GB RAM,Web 应用程序将获得不到 1GB 的内存。如果代码编写不严格,我担心可能会出现“OutOfMemoryError” - 我必须确保从流中一次读取一小块(例如 10MB)并将其写入远程 Linux 计算机的文件。 假设我在 Controller 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 是正确的选择,但我无法确定我必须如何继续 - 请对此进行指导。

最佳答案

我将实现一个FixedSizeQueue,并将QueueStream中的数据popAll()到另一台计算机。可能有双缓冲,只是为了提供网络/带宽问题的缓冲。

关于java - 使用网络应用程序上传大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12500185/

相关文章:

c - libevent2 和文件 io

java - 在不使用 POJO 的情况下使用 GSON 修改 json

java - 我应该在请求中创建 executorService 还是在 Web 应用程序中共享一个实例?

jquery - 上传后自动应用样式

java - 通过 Java lib Apache Commons 上传文件的简明示例

Java File.renameTo(文件)不工作

java - Android 以编程方式制作 CardView

java - Java 代码如何在 Jenkins 构建期间读取 Jenkins 全局凭证?

Wordpress 无法使用 c# 通过 wp.uploadFile 上传图像

file-io - 打开文件时在 Komodo Edit 中自动切换自动换行