Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我可以在没有客户端缓冲的情况下将多字节数组写入HttpClient吗? 问题_Java_Httpclient_Multipartentity - Fatal编程技术网

Java 我可以在没有客户端缓冲的情况下将多字节数组写入HttpClient吗? 问题

Java 我可以在没有客户端缓冲的情况下将多字节数组写入HttpClient吗? 问题,java,httpclient,multipartentity,Java,Httpclient,Multipartentity,我想使用Apache的HttpClient类4.1.2将最大为5或6 GB的大型文件上传到web服务器。例如,在发送这些文件之前,我将它们分成100 MB的小块。不幸的是,我看到的所有使用HttpClient进行多部分POST的示例似乎都是在发送文件内容之前缓冲文件内容,通常假定文件大小很小。下面是这样一个例子: HttpClient httpclient = new DefaultHttpClient(); HttpPost post = new HttpPost("http://www.ex

我想使用Apache的HttpClient类4.1.2将最大为5或6 GB的大型文件上传到web服务器。例如,在发送这些文件之前,我将它们分成100 MB的小块。不幸的是,我看到的所有使用HttpClient进行多部分POST的示例似乎都是在发送文件内容之前缓冲文件内容,通常假定文件大小很小。下面是这样一个例子:

HttpClient httpclient = new DefaultHttpClient();
HttpPost post = new HttpPost("http://www.example.com/upload.php");

MultipartEntity mpe = new MultipartEntity();

// Here are some plain-text fields as a part of our multi-part upload
mpe.addPart("chunkIndex", new StringBody(Integer.toString(chunkIndex)));
mpe.addPart("fileName", new StringBody(somefile.getName()));

// Now for a file to include; looks like we're including the whole thing!
FileBody bin = new FileBody(new File("/path/to/myfile.bin"));
mpe.addPart("myFile", bin);

post.setEntity(mpe);
HttpResponse response = httpclient.execute(post);
在本例中,看起来我们创建了一个新的FileBody对象并将其添加到MultipartEntity中。在我的例子中,文件的大小可能是100MB,我不希望一次缓冲所有这些数据。我希望能够以较小的数据块一次写入4MB的数据,例如,最终写入所有100MB的数据。通过直接写入输出流,我可以使用Java中的HTTPURLConnection类来实现这一点,但该类有自己的一系列问题,这就是我尝试使用Apache产品的原因

我的问题 是否可以将100 MB的数据写入HttpClient,但要以较小的迭代块的形式写入?我不希望客户端在实际执行POST之前必须缓冲高达100MB的数据。我看到的示例似乎都不允许您直接写入输出流;它们似乎都是在执行调用之前预先打包的

任何提示都将不胜感激

--更新-- 为了澄清,下面是我之前对HTTPURLConnection类所做的操作。我正试图找出如何在HttpClient中执行类似的操作:


如果我正确理解了您的问题,您关心的是将整个文件加载到内存中,对吗?。如果是这种情况,您应该使用诸如FileInputStream之类的流。这样,整个文件就不会立即被拉入内存

如果这样做没有帮助,并且您仍然希望将文件划分为多个块,那么您可以对服务器进行编码,以处理多个POST,在获得这些POST时连接数据,然后手动拆分文件的字节


就我个人而言,我更喜欢我的第一个答案,但不管是哪种方式,或者两种方式都不行,如果这些都没有帮助,祝你好运

如果我正确理解了您的问题,您关心的是将整个文件加载到内存中,对吗?。如果是这种情况,您应该使用诸如FileInputStream之类的流。这样,整个文件就不会立即被拉入内存

如果这样做没有帮助,并且您仍然希望将文件划分为多个块,那么您可以对服务器进行编码,以处理多个POST,在获得这些POST时连接数据,然后手动拆分文件的字节


就我个人而言,我更喜欢我的第一个答案,但不管是哪种方式,或者两种方式都不行,如果这些都没有帮助,祝你好运

流肯定是一条路要走,我记得不久前用一些更大的文件做了类似的事情,效果非常好

流肯定是一条路要走,我记得不久前用一些更大的文件做了类似的事情,效果非常好

您只需将自定义内容生成逻辑包装到HttpEntity实现中即可。这将使您能够完全控制内容生成和内容流的过程


另外,作为记录:HttpClient附带的MultipartEntity在将文件部分写入连接套接字之前不会在内存中缓冲它们

您只需将自定义内容生成逻辑包装到HttpEntity实现中即可。这将使您能够完全控制内容生成和内容流的过程


另外,作为记录:HttpClient附带的MultipartEntity在将文件部分写入连接套接字之前不会在内存中缓冲它们

服务器已经编码为处理多个帖子,并按照您的建议连接数据。我的问题是我不知道如何从客户端发送数据。使用HTTPURLConnection类,我将以byte[]数组的形式读入100MB的数据块,并将其一次写入4MB的输出流。我在这门课上似乎没有那种能力。因此,对于一次整体块传输,给定X个字节[]数组,如何发送它们?我不希望从客户端的这个块创建一个临时文件,尽管我想这是一个解决方案……如果我没有弄错的话,Apache的HttpClient能够将流作为请求实体。如果您正确设置了文件InputStream或w/e、InputStream,那么您应该能够将其添加到请求的实体中,并在服务器端提取HttpResponse输出流并对其进行解析。tcp/ip技术仍然让我有点困惑,但这应该足以避免文件最终被拉入内存。祝你好运服务器已经编码为处理多个帖子,并按照您的建议连接数据。我的问题是我不知道如何从客户端发送数据。使用HTTPURLConnection类,我将把100MB的块作为byte[]数组读入,然后写入
它一次传输到4MB的输出流。我在这门课上似乎没有那种能力。因此,对于一次整体块传输,给定X个字节[]数组,如何发送它们?我不希望从客户端的这个块创建一个临时文件,尽管我想这是一个解决方案……如果我没有弄错的话,Apache的HttpClient能够将流作为请求实体。如果您正确设置了文件InputStream或w/e、InputStream,那么您应该能够将其添加到请求的实体中,并在服务器端提取HttpResponse输出流并对其进行解析。tcp/ip技术仍然让我有点困惑,但这应该足以避免文件最终被拉入内存。祝你好运
// Get the connection's output stream
out = new DataOutputStream(conn.getOutputStream());

// Write some plain-text multi-part data
out.writeBytes(fieldBuffer.toString());

// Figure out how many loops we'll need to write the 100 MB chunk
int bufferLoops = (dataLength + (bufferSize - 1)) / bufferSize;

// Open the local file (~5 GB in size) to read the data chunk (100 MB)
raf = new RandomAccessFile(file, "r");
raf.seek(startingOffset); // Position the pointer to the beginning of the chunk

// Keep track of how many bytes we have left to read for this chunk
int bytesLeftToRead = dataLength;

// Write the file data block to the output stream
for(int i=0; i<bufferLoops; i++)
{
    // Create an appropriately sized mini-buffer (max 4 MB) for the pieces
    // of this chunk we have yet to read
    byte[] buffer = (bytesLeftToRead < bufferSize) ? 
                    new byte[bytesLeftToRead] : new byte[bufferSize];

    int bytes_read = raf.read(buffer); // Read ~4 MB from the local file
    out.write(buffer, 0, bytes_read); // Write that bit to the stream
    bytesLeftToRead -= bytes_read;
}

// Write the final boundary
out.writeBytes(finalBoundary);
out.flush();