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 ;
@@ -27,16 +28,17 @@ public class IoApi {
27
28
public static final int WITH_CRC32 = 2 ;
28
29
29
30
private static PutRet put (String uptoken , String key , File file ,
30
- PutExtra extra ) {
31
+ PutExtra extra , String filename ) {
31
32
32
33
if (!file .exists () || !file .canRead ()) {
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 ));
39
- AbstractContentBody fileBody = buildFileBody (file , extra );
41
+ AbstractContentBody fileBody = buildFileBody (file , extra , filename );
40
42
requestEntity .addPart ("file" , fileBody );
41
43
setKey (requestEntity , key );
42
44
setParam (requestEntity , extra .params );
@@ -62,11 +64,19 @@ private static PutRet put(String uptoken, String key, File file,
62
64
return new PutRet (ret );
63
65
}
64
66
65
- private static FileBody buildFileBody (File file ,PutExtra extra ){
67
+ private static FileBody buildFileBody (File file ,PutExtra extra , final String filename ){
66
68
if (extra .mimeType != null ){
67
- return new FileBody (file , extra .mimeType );
69
+ return new FileBody (file , extra .mimeType ){
70
+ public String getFilename () {
71
+ return filename == null ? super .getFilename () : filename ;
72
+ }
73
+ };
68
74
}else {
69
- return new FileBody (file );
75
+ return new FileBody (file ){
76
+ public String getFilename () {
77
+ return filename == null ? super .getFilename () : filename ;
78
+ }
79
+ };
70
80
}
71
81
}
72
82
@@ -85,11 +95,13 @@ private static void setParam(MultipartEntity requestEntity, Map<String, String>
85
95
}
86
96
}
87
97
88
- private static PutRet putStream (String uptoken , String key , InputStream reader ,PutExtra extra , String fileName ) {
98
+ private static PutRet putStream (String uptoken , String key , InputStream reader ,
99
+ PutExtra extra , String fileName , long length ) {
100
+ extra = extra == null ? new PutExtra () : extra ;
89
101
MultipartEntity requestEntity = new MultipartEntity ();
90
102
try {
91
103
requestEntity .addPart ("token" , new StringBody (uptoken ));
92
- AbstractContentBody inputBody = buildInputStreamBody (reader , extra , fileName != null ? fileName : "null" );
104
+ AbstractContentBody inputBody = buildInputStreamBody (reader , extra , fileName , length );
93
105
requestEntity .addPart ("file" , inputBody );
94
106
setKey (requestEntity , key );
95
107
setParam (requestEntity , extra .params );
@@ -109,22 +121,103 @@ private static PutRet putStream(String uptoken, String key, InputStream reader,P
109
121
return new PutRet (ret );
110
122
}
111
123
112
- private static InputStreamBody buildInputStreamBody (InputStream reader ,PutExtra extra , String fileName ){
124
+ private static AbstractContentBody buildInputStreamBody (InputStream reader ,
125
+ PutExtra extra , String fileName , final long length ){
126
+ fileName = fileName != null ? fileName : "null" ;
113
127
if (extra .mimeType != null ){
114
- return new InputStreamBody (reader , extra .mimeType , fileName );
128
+ return new InputStreamBody (reader , extra .mimeType , fileName ){
129
+ public long getContentLength () {
130
+ return length ;
131
+ }
132
+ };
115
133
}else {
116
- return new InputStreamBody (reader , fileName );
134
+ return new InputStreamBody (reader , fileName ){
135
+ public long getContentLength () {
136
+ return length ;
137
+ }
138
+ };
117
139
}
118
140
}
119
141
142
+
143
+ private static PutRet putStream0 (String uptoken , String key , InputStream reader ,
144
+ PutExtra extra , String fileName , long length ){
145
+ length = length <= 0 ? getLength (reader ) : length ;
146
+ if (length != -1 ) {
147
+ return putStream (uptoken ,key ,reader ,extra , fileName , length );
148
+ }else {
149
+ return toPutFile (uptoken , key , reader , extra , fileName );
150
+ }
151
+
152
+ }
153
+
154
+ private static long getLength (InputStream is ){
155
+ try {
156
+ return is .available ();
157
+ } catch (Exception e ) {
158
+ return -1 ;
159
+ }
160
+ }
161
+
162
+ private static PutRet toPutFile (String uptoken , String key ,
163
+ InputStream reader , PutExtra extra , String fileName ) {
164
+ File file = null ;
165
+ try {
166
+ file = copyToTmpFile (reader );
167
+ return put (uptoken , key , file , extra , fileName );
168
+ }finally {
169
+ if (file != null ){
170
+ try {file .delete ();}catch (Exception e ){}
171
+ }
172
+ }
173
+ }
174
+
175
+
176
+ private static File copyToTmpFile (InputStream from ){
177
+ FileOutputStream os = null ;
178
+ try {
179
+ File to = File .createTempFile ("qiniu_" , ".tmp" );
180
+ os = new FileOutputStream (to );
181
+ byte [] b = new byte [64 * 1024 ];
182
+ int l ;
183
+ while ((l = from .read (b )) != -1 ) {
184
+ os .write (b , 0 , l );
185
+ }
186
+ os .flush ();
187
+ return to ;
188
+ }catch (Exception e ){
189
+ throw new RuntimeException ("create tmp file failed." , e );
190
+ }finally {
191
+ if (os != null ){
192
+ try {os .close ();}catch (Exception e ){}
193
+ }
194
+ if (from != null ){
195
+ try {from .close ();}catch (Exception e ){}
196
+ }
197
+ }
198
+ }
199
+
200
+
120
201
public static PutRet put (String uptoken ,String key ,InputStream reader ,PutExtra extra ){
121
- return putStream (uptoken ,key ,reader ,extra , null );
202
+ return putStream0 (uptoken ,key ,reader ,extra , null , - 1 );
122
203
}
123
204
124
205
public static PutRet put (String uptoken ,String key ,InputStream reader ,PutExtra extra , String fileName ){
125
- return putStream (uptoken ,key ,reader ,extra , fileName );
206
+ return putStream0 (uptoken ,key ,reader ,extra , fileName , - 1 );
126
207
}
127
208
209
+ /**
210
+ * @param uptoken
211
+ * @param key
212
+ * @param reader
213
+ * @param extra
214
+ * @param fileName
215
+ * @param length 部分流 is.available() == 0,此时可指定内容长度
216
+ * @return
217
+ */
218
+ public static PutRet put (String uptoken ,String key ,InputStream reader ,PutExtra extra , String fileName , long length ){
219
+ return putStream0 (uptoken ,key ,reader ,extra , fileName , length );
220
+ }
128
221
129
222
public static PutRet Put (String uptoken ,String key ,InputStream reader ,PutExtra extra )
130
223
{
@@ -145,7 +238,7 @@ public static PutRet putFile(String uptoken, String key, File file, PutExtra ext
145
238
return new PutRet (new CallRet (Config .ERROR_CODE , e ));
146
239
}
147
240
}
148
- return put (uptoken , key , file , extra );
241
+ return put (uptoken , key , file , extra , null );
149
242
}
150
243
151
244
private static long getCRC32 (File file ) throws Exception {
@@ -171,4 +264,5 @@ private static long getCRC32(File file) throws Exception {
171
264
}
172
265
return crc ;
173
266
}
267
+
174
268
}
0 commit comments