2

URLから画像をダウンロードする方法があります。以下のように..

public static byte[] downloadImageFromURL(final String strUrl) {
    InputStream in;
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    try {
        URL url = new URL(strUrl);
        in = new BufferedInputStream(url.openStream());
        byte[] buf = new byte[2048];
        int n = 0;
        while (-1 != (n = in.read(buf))) {
            out.write(buf, 0, n);
        }
        out.close();
        in.close();
    }
    catch (IOException e) {
        return null;
    }
    return out.toByteArray();
}

画像の URL があり、有効です。例えば。

https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcTxfYM-hnD-Z80tgWdIgQKchKe-MXVUfTpCw1R5KkfJlbRbgr3Zcg

私の問題は、画像が本当に存在しない場合はダウンロードしたくないということです.Like ....

https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcTxfYM-hnD-Z80tgWdIgQKchKe-MXVUfTpCw1R5KkfJlbRbgr3Zcgaaaaabbbbddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddを

この画像は私の方法ではダウンロードできません。では、与えられた画像の URL が実際には存在しないことをどのように知ることができますか。URL を検証したくありません (それは私の解決策ではないかもしれません)。

それで、私はそれをグーグルで検索しました。この記事から... URLが存在するかどうかを確認する方法、またはJavaで404を返す方法は? URLを使用してリモートサーバーにファイルが存在するかどうかを 確認します

しかし、この con.getResponseCode() は常にステータス コード "200" を返します。これは、私のメソッドが無効な画像 URL もダウンロードすることを意味します。だから、私は私のbufferStreamを次のように出力します...

System.out.println(in.read(buf));

無効な画像 URL は「43」を生成します。したがって、これらのコード行をメソッドに追加します。

    if (in.read(buf) == 43) {
       return null;
    }

大丈夫です。しかし、それで必ず満足できるとは思いません。それを取得する別の方法はありますか?私は正しいですか?提案があれば本当に感謝します。この問題は私の頭を構成するかもしれません。私の質問を読んでくれてありがとう。

*アップデート

このダウンロードメソッドを呼び出し、ダウンロードした画像をディレクトリに保存します..

            // call method to save image
            FileSupport.saveFile(filePath+".JPG", data);

その後、次のように出力しようとしました...

            File file = new File(filePath+".JPG);
            System.err.println(file.length());

また、無効な画像 URL に対して「43 」が生成される場合もあります。すべての無効な URL に対して「43」が返される理由を知りたいです。「43」とは?

4

4 に答える 4

1

もしも

con.setRequestMethod("HEAD");

このようなことを行う必要があります (画像が存在しない場合、接続の入力ストリームからの読み取りは失敗します。

  HttpUrlConnection con = (HttpUrlConnection)url.openConnection;
  con.setRequestMethod("GET");
  con.addRequestProperty("User-Agent", "Mozilla/4.0");

  int responseCode = con.getResponseCode(); //if you do not get 200 here, you can stop

  if(responseCode != HttpUrlConnection.HTTP_OK) {
    return;
  }
  // Now, read image buffer
  byte[] image = null;

  try{

       InputStream in = new BufferedInputStream(con.getInputStream());
       ByteArrayOutputStream out = new ByteArrayOutputStream();
       byte[] buf = new byte[1024];

       int n = 0;

       while (-1!=(n=in.read(buf)))
       {
          out.write(buf, 0, n);
       }
       out.close();
       in.close();
       image = out.toByteArray();

    } catch (IOException ioe){
       // do whatever you need
    } finally {
       con.disconnect();
    }

また、このコード

 if (in.read(buf) == 43) {
       return null;
 }

よく見えません。なんらかのマジック ナンバーですが、それが何であるかは不明です。

于 2013-10-26T03:43:00.627 に答える
0

これは私がそれを行う方法です:

//By Nishanth Chandradas

import java.awt.Image;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import javax.activation.MimetypesFileTypeMap;
import javax.swing.ImageIcon;

import java.io.File;

public class downloadimagefromurl {

    /**
     * @param args
     * @throws IOException 
     */

    public static byte[] downloadImageFromURL(final String strUrl) throws IOException {
        InputStream in;
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        try {
            URL url = new URL(strUrl);
            in = new BufferedInputStream(url.openStream());
            byte[] buf = new byte[2048];
            int n = 0;
            while (-1 != (n = in.read(buf))) {
                out.write(buf, 0, n);
            }
            out.close();
            in.close();
        }
        catch (IOException e) {
            return null;
        }
        byte[] response = out.toByteArray();
        FileOutputStream fos = new FileOutputStream("/Users/Nish/Desktop/image.jpg");
        fos.write(response);
        fos.close();
        return response;
    }

    static boolean isImage(String image_path){
          Image image = new ImageIcon(image_path).getImage();
          if(image.getWidth(null) == -1){
                return false;
          }
          else{
                return true;
          }
        }

    public static void main(String[] args) throws IOException {
        downloadImageFromURL("https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcTxfYM-hnD-Z80tgWdIgQKchKe-MXVUfTpCw1R5KkfJlbRbgr3Zcg");
     System.out.println(isImage("/Users/Nish/Desktop/image.jpg"));
    }

ダウンロードがイメージかどうかに応じて、出力は true または false になります。

于 2013-10-26T03:22:37.553 に答える
-1

2 つ目の catch ステートメントを追加して、java.io.FileNotFoundException をキャッチできます。

catch (FileNotFoundException e) {
    // Failed
}
于 2013-10-26T03:08:16.067 に答える