Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.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中的PUT请求上载文件,并执行上载进度_Java_Http_Http Put - Fatal编程技术网

使用Java中的PUT请求上载文件,并执行上载进度

使用Java中的PUT请求上载文件,并执行上载进度,java,http,http-put,Java,Http,Http Put,我正在尝试做一些非常简单的事情,但到目前为止,我还没有成功地尝试各种方法来实现它。我尝试过使用一个简单的java.io.Socket、一个java.io.HttpURLConnection、一个org.apache.commons.httpclient.httpclient上传到URL,但每次都失败了 我需要提出这样的请求: PUT http://1.2.3.4:8080/upload?ticket_id=abcdef124567890 HTTP/1.1 Host: 1.2.3.4:8080 C

我正在尝试做一些非常简单的事情,但到目前为止,我还没有成功地尝试各种方法来实现它。我尝试过使用一个简单的
java.io.Socket
、一个
java.io.HttpURLConnection
、一个
org.apache.commons.httpclient.httpclient
上传到URL,但每次都失败了

我需要提出这样的请求:

PUT http://1.2.3.4:8080/upload?ticket_id=abcdef124567890 HTTP/1.1
Host: 1.2.3.4:8080
Content-Length: 339108
Content-Type: video/mp4

\0abc\32af ... etc.
我需要将文件的字节(可能来自
FileInputStream
)写入主请求体,其中包含视频字节

我基本上有两个要求:

  • 我必须使用PUT请求将文件上载到给定的服务器
  • 我必须能够看到上传的进展,因为它正在发生
  • 如何在Java中实现这一点


    编辑 下面是我尝试使用Apache的
    HttpClient

    HttpClient httpClient = new HttpClient();
    PutMethod httpMethod = new PutMethod(ticket.getEndpoint());
    httpMethod.setRequestHeader("Content-Type", "video/mp4");
    httpMethod.setRequestHeader("Content-Length", String.valueOf(getStreamFile().length()));
    
    final FileInputStream streamFileInputStream = new FileInputStream(getStreamFile());
    final BufferedInputStream bufferedInputStream = new BufferedInputStream(streamFileInputStream);
    
    httpMethod.setRequestEntity(new RequestEntity() {
        @Override public void writeRequest(OutputStream out) 
                throws IOException {
            byte[] fileBuffer = new byte[getBufferLength()];
            
            int bytesRead = 0;
            int totalBytesRead = 0;
            final int totalFileBytes = (int)getStreamFile().length();
            
            while ((bytesRead = bufferedInputStream.read(fileBuffer)) > 0) {
                out.write(fileBuffer, 0, bytesRead);
                totalBytesRead += bytesRead;
                
                notifyListenersOnProgress((double)totalBytesRead / (double)totalFileBytes);
            }
        }
        
        @Override public boolean isRepeatable() {
            return true;
        }
        
        @Override public String getContentType() {
            return "video/mp4";
        }
        
        @Override public long getContentLength() {
            return getStreamFile().length();
        }
    });
    
    final int responseCode = httpClient.executeMethod(httpMethod);
    
    logger.debug("Server Response {}: {}", responseCode, 
            httpMethod.getResponseBodyAsString());
    

    此操作失败,出现
    java.net.SocketException:breaked pipe
    异常。

    对于1,您需要使用。被引用的帖子对此进行了描述。对于2,在发送数据时使用一些包装器。计数流可能需要挂接在HttpClient内部


    如果您添加更多不适合您的细节,可以提供更多详细信息。

    好的,更新了我的问题。即使服务器希望直接从请求体读取,我是否仍然需要PUT请求中的多部分请求?管道中断异常,可能意味着服务器关闭了连接。它可能是因为检测到某个字节序列或其他原因才这样做的。多部分协议确保二进制数据正确通过,但显然您必须以服务器可以理解的格式发送数据。你控制服务器代码吗?不,它是一个协议,并根据该协议接受东西。我正在按照指示操作,但由于某种原因失败了。可能是他们检测到文件有问题。我似乎对你的客户没有问题。我会联系他们的支持(或在他们的支持论坛上发布)。