2
2
3
3
import java .io .File ;
4
4
import java .io .FileInputStream ;
5
+ import java .io .FileOutputStream ;
5
6
import java .io .InputStream ;
6
7
import java .io .UnsupportedEncodingException ;
7
8
import java .nio .charset .Charset ;
@@ -33,6 +34,7 @@ private static PutRet put(String uptoken, String key, File file,
33
34
return new PutRet (new CallRet (Config .ERROR_CODE , new Exception (
34
35
"File does not exist or not readable." )));
35
36
}
37
+ extra = extra == null ? new PutExtra () : extra ;
36
38
MultipartEntity requestEntity = new MultipartEntity ();
37
39
try {
38
40
requestEntity .addPart ("token" , new StringBody (uptoken ));
@@ -85,11 +87,14 @@ private static void setParam(MultipartEntity requestEntity, Map<String, String>
85
87
}
86
88
}
87
89
88
- private static PutRet putStream (String uptoken , String key , InputStream reader ,PutExtra extra , String fileName ) {
90
+ private static PutRet putStream (String uptoken , String key , InputStream reader ,
91
+ PutExtra extra , long length ) {
92
+ extra = extra == null ? new PutExtra () : extra ;
89
93
MultipartEntity requestEntity = new MultipartEntity ();
90
94
try {
91
95
requestEntity .addPart ("token" , new StringBody (uptoken ));
92
- AbstractContentBody inputBody = buildInputStreamBody (reader , extra , fileName != null ? fileName : "null" );
96
+ String fileName = key != null ? key : "null" ;
97
+ AbstractContentBody inputBody = buildInputStreamBody (reader , extra , fileName , length );
93
98
requestEntity .addPart ("file" , inputBody );
94
99
setKey (requestEntity , key );
95
100
setParam (requestEntity , extra .params );
@@ -109,26 +114,97 @@ private static PutRet putStream(String uptoken, String key, InputStream reader,P
109
114
return new PutRet (ret );
110
115
}
111
116
112
- private static InputStreamBody buildInputStreamBody (InputStream reader ,PutExtra extra , String fileName ){
117
+ private static AbstractContentBody buildInputStreamBody (InputStream reader ,
118
+ PutExtra extra , String fileName , final long length ){
113
119
if (extra .mimeType != null ){
114
- return new InputStreamBody (reader , extra .mimeType , fileName );
120
+ return new InputStreamBody (reader , extra .mimeType , fileName ){
121
+ public long getContentLength () {
122
+ return length ;
123
+ }
124
+ };
115
125
}else {
116
- return new InputStreamBody (reader , fileName );
126
+ return new InputStreamBody (reader , fileName ){
127
+ public long getContentLength () {
128
+ return length ;
129
+ }
130
+ };
117
131
}
118
132
}
119
133
120
- public static PutRet put (String uptoken ,String key ,InputStream reader ,PutExtra extra ){
121
- return putStream (uptoken ,key ,reader ,extra , null );
134
+
135
+ private static PutRet putStream0 (String uptoken , String key , InputStream reader ,
136
+ PutExtra extra , long length ){
137
+ length = length <= 0 ? getLength (reader ) : length ;
138
+ if (length != -1 ) {
139
+ return putStream (uptoken ,key ,reader ,extra , length );
140
+ }else {
141
+ return toPutFile (uptoken , key , reader , extra );
142
+ }
143
+
122
144
}
123
145
124
- public static PutRet put (String uptoken ,String key ,InputStream reader ,PutExtra extra , String fileName ){
125
- return putStream (uptoken ,key ,reader ,extra , fileName );
146
+ private static long getLength (InputStream is ){
147
+ try {
148
+ return is .available ();
149
+ } catch (Exception e ) {
150
+ return -1 ;
151
+ }
126
152
}
127
153
154
+ private static PutRet toPutFile (String uptoken , String key ,
155
+ InputStream reader , PutExtra extra ) {
156
+ File file = null ;
157
+ try {
158
+ file = copyToTmpFile (reader );
159
+ return put (uptoken , key , file , extra );
160
+ }finally {
161
+ if (file != null ){
162
+ try {file .delete ();}catch (Exception e ){}
163
+ }
164
+ }
165
+ }
166
+
167
+
168
+ private static File copyToTmpFile (InputStream from ){
169
+ FileOutputStream os = null ;
170
+ try {
171
+ File to = File .createTempFile ("qiniu_" , ".tmp" );
172
+ os = new FileOutputStream (to );
173
+ byte [] b = new byte [64 * 1024 ];
174
+ int l ;
175
+ while ((l = from .read (b )) != -1 ) {
176
+ os .write (b , 0 , l );
177
+ }
178
+ os .flush ();
179
+ return to ;
180
+ }catch (Exception e ){
181
+ throw new RuntimeException ("create tmp file failed." , e );
182
+ }finally {
183
+ if (os != null ){
184
+ try {os .close ();}catch (Exception e ){}
185
+ }
186
+ if (from != null ){
187
+ try {from .close ();}catch (Exception e ){}
188
+ }
189
+ }
190
+ }
191
+
192
+
193
+ /**
194
+ * @param uptoken
195
+ * @param key
196
+ * @param reader
197
+ * @param extra
198
+ * @param length 部分流 is.available() == 0,此时可指定内容长度
199
+ * @return
200
+ */
201
+ public static PutRet Put (String uptoken ,String key ,InputStream reader ,PutExtra extra , long length ){
202
+ return putStream0 (uptoken ,key ,reader ,extra , length );
203
+ }
128
204
129
205
public static PutRet Put (String uptoken ,String key ,InputStream reader ,PutExtra extra )
130
206
{
131
- return put (uptoken ,key ,reader ,extra );
207
+ return Put (uptoken ,key ,reader ,extra , - 1 );
132
208
}
133
209
134
210
@@ -171,4 +247,5 @@ private static long getCRC32(File file) throws Exception {
171
247
}
172
248
return crc ;
173
249
}
250
+
174
251
}
0 commit comments