22
33import java .io .File ;
44import java .io .FileInputStream ;
5+ import java .io .FileOutputStream ;
56import java .io .InputStream ;
67import java .io .UnsupportedEncodingException ;
78import java .nio .charset .Charset ;
@@ -33,6 +34,7 @@ private static PutRet put(String uptoken, String key, File file,
3334 return new PutRet (new CallRet (Config .ERROR_CODE , new Exception (
3435 "File does not exist or not readable." )));
3536 }
37+ extra = extra == null ? new PutExtra () : extra ;
3638 MultipartEntity requestEntity = new MultipartEntity ();
3739 try {
3840 requestEntity .addPart ("token" , new StringBody (uptoken ));
@@ -85,11 +87,14 @@ private static void setParam(MultipartEntity requestEntity, Map<String, String>
8587 }
8688 }
8789
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 ;
8993 MultipartEntity requestEntity = new MultipartEntity ();
9094 try {
9195 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 );
9398 requestEntity .addPart ("file" , inputBody );
9499 setKey (requestEntity , key );
95100 setParam (requestEntity , extra .params );
@@ -109,26 +114,97 @@ private static PutRet putStream(String uptoken, String key, InputStream reader,P
109114 return new PutRet (ret );
110115 }
111116
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 ){
113119 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+ };
115125 }else {
116- return new InputStreamBody (reader , fileName );
126+ return new InputStreamBody (reader , fileName ){
127+ public long getContentLength () {
128+ return length ;
129+ }
130+ };
117131 }
118132 }
119133
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+
122144 }
123145
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+ }
126152 }
127153
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+ }
128204
129205 public static PutRet Put (String uptoken ,String key ,InputStream reader ,PutExtra extra )
130206 {
131- return put (uptoken ,key ,reader ,extra );
207+ return Put (uptoken ,key ,reader ,extra , - 1 );
132208 }
133209
134210
@@ -171,4 +247,5 @@ private static long getCRC32(File file) throws Exception {
171247 }
172248 return crc ;
173249 }
250+
174251}
0 commit comments