上传文件报错,报错代码如下:
Caused by: java.io.IOException: Broken pipe
at sun.nio.ch.FileDispatcherImpl.write0(Native Method)
at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:47)
at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93)
at sun.nio.ch.IOUtil.write(IOUtil.java:65)
at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:468)
at org.apache.tomcat.util.net.NioChannel.write(NioChannel.java:138)
at org.apache.tomcat.util.net.NioBlockingSelector.write(NioBlockingSelector.java:101)
at org.apache.tomcat.util.net.NioSelectorPool.write(NioSelectorPool.java:152)
at org.apache.tomcat.util.net.NioEndpoint
N
i
o
S
o
c
k
e
t
W
r
a
p
p
e
r
.
d
o
W
r
i
t
e
(
N
i
o
E
n
d
p
o
i
n
t
.
j
a
v
a
:
1253
)
a
t
o
r
g
.
a
p
a
c
h
e
.
t
o
m
c
a
t
.
u
t
i
l
.
n
e
t
.
S
o
c
k
e
t
W
r
a
p
p
e
r
B
a
s
e
.
d
o
W
r
i
t
e
(
S
o
c
k
e
t
W
r
a
p
p
e
r
B
a
s
e
.
j
a
v
a
:
764
)
a
t
o
r
g
.
a
p
a
c
h
e
.
t
o
m
c
a
t
.
u
t
i
l
.
n
e
t
.
S
o
c
k
e
t
W
r
a
p
p
e
r
B
a
s
e
.
w
r
i
t
e
B
l
o
c
k
i
n
g
(
S
o
c
k
e
t
W
r
a
p
p
e
r
B
a
s
e
.
j
a
v
a
:
584
)
a
t
o
r
g
.
a
p
a
c
h
e
.
t
o
m
c
a
t
.
u
t
i
l
.
n
e
t
.
S
o
c
k
e
t
W
r
a
p
p
e
r
B
a
s
e
.
w
r
i
t
e
(
S
o
c
k
e
t
W
r
a
p
p
e
r
B
a
s
e
.
j
a
v
a
:
528
)
a
t
o
r
g
.
a
p
a
c
h
e
.
c
o
y
o
t
e
.
h
t
t
p
11.
H
t
t
p
11
O
u
t
p
u
t
B
u
f
f
e
r
NioSocketWrapper.doWrite(NioEndpoint.java:1253) at org.apache.tomcat.util.net.SocketWrapperBase.doWrite(SocketWrapperBase.java:764) at org.apache.tomcat.util.net.SocketWrapperBase.writeBlocking(SocketWrapperBase.java:584) at org.apache.tomcat.util.net.SocketWrapperBase.write(SocketWrapperBase.java:528) at org.apache.coyote.http11.Http11OutputBuffer
NioSocketWrapper.doWrite(NioEndpoint.java:1253)atorg.apache.tomcat.util.net.SocketWrapperBase.doWrite(SocketWrapperBase.java:764)atorg.apache.tomcat.util.net.SocketWrapperBase.writeBlocking(SocketWrapperBase.java:584)atorg.apache.tomcat.util.net.SocketWrapperBase.write(SocketWrapperBase.java:528)atorg.apache.coyote.http11.Http11OutputBufferSocketOutputBuffer.doWrite(Http11OutputBuffer.java:546)
at org.apache.coyote.http11.filters.IdentityOutputFilter.doWrite(IdentityOutputFilter.java:73)
at org.apache.coyote.http11.Http11OutputBuffer.doWrite(Http11OutputBuffer.java:193)
at org.apache.coyote.Response.doWrite(Response.java:601)
at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:339)
… 89 common frames omitted
然后也查了许多原因;说是磁盘空间满了;导致写文件失败。也确实如此。
虽然问题解决了,但问题最本质的原因并没有找到:
文件上传时会暂时放在服务器的磁盘缓存区;磁盘空间满了后,文件还能存入缓冲区吗?如果能的话为何不能取?文件上传都会经过磁盘缓存吗?什么情况不经过磁盘缓存?
情况说明:服务部署在linux服务器上;手机App上传文件到七牛云服务器。
按照我的理解是app上传文件到七牛云服务器;不应该是七牛云空间满了之后无法写入吗?为什么linux服务器磁盘满了也无法上传呢?
app选择文件是直接上传到七牛云了;首先jar服务要读取文件----->写入文件。那么究竟是jar服务读写文件还是jar服务所在的服务器读写文件呢?也就是jar所在的服务器承担了什么样的功能?
文件上传都会走磁盘缓存吗?
最终终结了一下(不对的地方大家互相指点交流)
jar服务读写文件;文件会放在缓冲区(服务器的磁盘缓存,磁盘空间满了导致无法写文件)。
大家可以看看这篇文章:文件上传原理