2016-04-18 9 views
1

しかし、問題は疑わしいです。 JARからサーバーに画像をアップロードしています。おおよその時間アップロードファイルを計算する

long startTime = System.currentTimeMillis(); 
long stopTime = System.currentTimeMillis(); 
long elapsedTime = stopTime - startTime; 
System.out.println("TIME ::: " + (float)(elapsedTime/1000) + " seg"); 

は、今私はおおよその立ち上がり時間を得ることについて考えていた:私は次のように、それはすべてのサーバーを登るためにかかった時間を計算するコードを持っていました。このJARは、非常に良い品質の写真と遅延時間が延長されているので、私はユーザーのための追加情報としてしかやりたくありません。私は最初の画像を思い浮かべて、その画像をアップロードするためにどれくらいかかり、その値にユーザーが選択したフォルダにある画像の合計値を掛けたものを計算することができます。それは有効と思われますが、何らかの形で若干正確なものがあれば、どういうわけかJavaやそれに類似したものが統合されていれば、あなたに来たいと思っていました。

今、私は自分のサーバーに、このように画像をアップロードする:

public boolean uploadWithThumb(File image, String filename) { 
    reconnect(); 

    try { 
     _sftp.cd(Config.Config.IMAGES_FOLDER); 
     _sftp.put(new FileInputStream(image), filename, ChannelSftp.OVERWRITE); //no overwrite (, ChannelSftp.OVERWRITE) 

     OutputStream output = new ByteArrayOutputStream(); 
     //preview 
     if (Config.Config.WATERMARK_FILE == "" || !(new File(Config.Config.WATERMARK_FILE)).exists()) { 
      //no watermark 
      Thumbnails.of(image) 
       .size(Config.Config.PREVIEW_SIZE, Config.Config.PREVIEW_SIZE) 
       .outputQuality(Config.Config.PREVIEW_QUALITY) 
       .toOutputStream(output); 
     } else { 
      BufferedImage prev = Thumbnails.of(image) 
              .size(Config.Config.PREVIEW_SIZE, Config.Config.PREVIEW_SIZE) 
              .outputQuality(Config.Config.PREVIEW_QUALITY) 
              .asBufferedImage(); 
      int wsize = Config.Config.PREVIEW_SIZE * 75/100; 
      BufferedImage water = Thumbnails.of(Config.Config.WATERMARK_FILE) 
              .size(wsize, wsize) 
              .asBufferedImage(); 
      Thumbnails.of(prev) 
         .size(Config.Config.PREVIEW_SIZE, Config.Config.PREVIEW_SIZE) 
         .watermark(Positions.CENTER, water, 0.5f) 
         .outputFormat(Utils.getExtensionNoDot(image.getAbsolutePath())) 
         .toOutputStream(output); 
     } 

     InputStream decodedInput = new ByteArrayInputStream(((ByteArrayOutputStream) output).toByteArray()); 
     _sftp.cd(Config.Config.PREVIEW_FOLDER); 
     _sftp.put(decodedInput, filename, ChannelSftp.OVERWRITE); //no overwrite (, ChannelSftp.OVERWRITE) 

     //thumbs 
     output = new ByteArrayOutputStream(); 
     Thumbnails.of(image) 
        .size(Config.Config.THUMBS_SIZE, Config.Config.THUMBS_SIZE) 
        .toOutputStream(output); 
     decodedInput = new ByteArrayInputStream(((ByteArrayOutputStream) output).toByteArray()); 
     _sftp.cd(Config.Config.THUMBS_FOLDER); 
     _sftp.put(decodedInput, filename, ChannelSftp.OVERWRITE); //no overwrite (, ChannelSftp.OVERWRITE) 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return false; 
    } 

    return true; 
} 

答えて

0

アップロード内のすべてのファイルをおおよその時間を取得する最も簡単な方法は、一つのファイルをアップロードし、速度を計算することである。

long firstImageSize = getImageSize(0); //get the size of the first image in bytes 
long startTime = System.currentTimeMillis(); 
UploadFirstImage(); //Upload the first image 
long stopTime = System.currentTimeMillis(); 
long elapsedTime = stopTime - startTime; 
float meanSpeed = (float)firstImageSize/ (float)(elapsedTime/1000); //mean speed in bytes/second 

平均アップロード速度を取得すると、他のすべての画像の全体サイズを取得する必要があります。そして、あなたは単純に割るおおよそeplapsed時間を計算できます。

long allImagesSize = 0; 
for(int i = 1; i<numImages; i++){ 
    allImagesSize += getImageSize(i); //Calculate the size of all the images in bytes 
} 
System.out.println("Eplapsed time ::: " + (float)(allImagesSize/meanSpeed) + " seg"); 

あなたが定期的にこれを計算するためにスレッドを使用することができ、リアルタイムで時間推定を更新する場合。

+0

こんにちは!ありがとう!あなたのコードにお返事いただきありがとうございますが、50秒かかるうちに約226秒かかります。私はfile.length()でファイルサイズを取得しています – hateful

+0

アップロードの速度はネットワークの使用量と、送受信のウィンドウを変えるTCP/IPのようなプロトコルとの相対的なものです。より正確な推定を行うには、同じコードを使用して速度を定期的に再計算することができます。 –

関連する問題