java使用jackrabbit去做webdav上传文件时出现Connection reset by peer: socket write error问题

在使用Java的Jackrabbit库进行WebDAV文件上传时,遇到一个问题:当通过内网IP请求上传时,出现'Connection reset by peer: socket write error'异常。虽然通过域名请求没有问题,且Postman使用IP请求也正常。经过分析源码,发现可能是由于在使用IP地址时未正确处理content-length导致的。目前原因尚未完全理解,欢迎了解该问题的读者交流讨论。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

发现使用域名去请求上传文件时,没有问题,后来想提升上传速度,就换成内网ip去请求上传,但是请求后会出现 java.net.SocketException: Connection reset by peer: socket write error的问题,后面又通过postman直接用ip请求发现也是没有问题的,所以对比查看一下jackrabbit和httpclient的源码,发现是ip地址请求时没有对 content-length做处理,具体再深层次的原因应该socket连接的问题,目前自己还没完全吃透,所以就不做详细解释了,免得说错误导大家,如果有知道的朋友可以一起讨论一下。

实现代码如下:

// 上传文件
HttpPut put = new HttpPut(webDavConfig.getBaseUrl() + webDavConfig.getDav() + URLEncoder.encode(fullPath, "utf-8"));
InputStreamEntity requestEntity = new InputStreamEntity(new FileInputStream(file), file.length());
// 在这里设置 content-length 如果在后面通过 put.addHeader()或put.setHeader()的方式设置content-length,会再次报错提示content-length已存在
put.setEntity(requestEntity);
HttpResponse putResponse = client.execute(put, context);
int putStatus = putResponse.getStatusLine().getStatusCode();

if (putStatus == HttpStatus.CREATED.value()) {
    log.info("### web dav upload file:{} success", fullPath);
    // 上传成功后获取分享链接
    HttpPost post = new HttpPost(webDavCon
### 使用 Jackrabbit 通过 WebDAV 协议上传文件 为了实现使用 JackrabbitWebDAV 进行文件上传,可以遵循以下方法。此过程涉及创建必要的客户端配置并执行实际的文件传输操作。 #### 创建 DavSession 实例 首先需要建立与目标服务器的有效连接会话。这通常涉及到提供认证信息以及指定远程资源的位置: ```java DavResourceLocator locator = new SimpleResourceLocator( "http://your.server.com/path/to/webdav", "/path/to/resource"); Credentials creds = new UsernamePasswordCredentials("username", "password".toCharArray()); DavSession session = DavSessionFactory.createDefault().createSession(creds, null); session.setResourceLocator(locator); ``` #### 执行 PUT 请求以上传文件 一旦获得了有效的 `DavSession` 对象,则可以通过发送 HTTP PUT 请求来完成文件上传动作。这里展示了一个简单的方法用于将本地文件流写入到远端位置[^1]: ```java FileInputStream fis = new FileInputStream(new File("/local/file/path")); try { DavMethod method = new PutMethod(); ((PutMethod)method).setRequestEntity(new InputStreamRequestEntity(fis)); int status = session.execute(method); // 发送请求 if (status >= 200 && status < 300){ System.out.println("Upload successful!"); } else { throw new IOException("Failed to upload file."); } } finally { fis.close(); } ``` 上述代码片段展示了如何利用 Apache Jackrabbit 的 API 来构建一个基本的功能模块,从而能够向支持 WebDAV 的服务器上传文件。需要注意的是,在生产环境中应当考虑更复杂的错误处理机制和服务可用性的验证逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值