Загрузите изображение с URL и ограничьте размер файла - PullRequest
2 голосов
/ 14 декабря 2011

Я нашел, как загрузить изображение из URL, используя этот вопрос на SO: , как загрузить изображение из Интернета в java

Но я бы хотел ограничить размерзагружаемого файла, потому что все ответы имеют это общее: если пользователь присвоит URL одному файлу терабайта, это приведет к сбою моего сервера: /

Как я могу ограничить размер загружаемого файла?

Спасибо за вашу помощь!:)

Ответы [ 4 ]

5 голосов
/ 14 декабря 2011

Следуя коду, который вы получили из предыдущего ответа ...

URL url = new URL("http://host/theimage.jpg");
URLConnection conn = new URLConnection(url);

// now you get the content length
int cLength = conn.getContentLength();

InputStream in = conn.getInputStream();

Подробнее о методах URLConnection () здесь.

DoПримите во внимание, что это будет учитывать только заголовки HTTP, предоставленные другим концом, нет никаких причин, по которым он будет соответствовать или быть честным по этому поводу.Так что, если вы играете на действительно безопасной и «не взломанной» стороне, вы должны проверить InputStream по мере его поступления и завершить его после фиксированного количества данных.

3 голосов
/ 14 декабря 2011

Если вы хотите гарантировать , что вы не загрузите больше определенной суммы, вам нужно обернуть InputStream своей собственной реализацией. По сути создайте новый класс

/**
 * Limits the amount of data you can read.
 * Warning: this only partially implements all the necessary methods.
 *     You will need to implement the rest that I was too lazy to include.
 */
public class InputStreamLimiter extends InputStream {
    private final InputStream wrappedInputStream;
    private int bytesRead;
    private final maxBytes;
    public InputStreamLimiter(final InputStream stream, final int maxBytes)
    {
        this.maxBytes=maxBytes;
        this.wrappedInputStream=stream;
    }
    public int available(){return wrappedInputStream.available();}
    public void close(){wrappedInputStream.close();}
    //Continue wrapping methods until you reach the read() methods.

    /**
     * Provide your own implementation of the read methods that make sure you don't attempt to read too many bytes.
     * This method crashes if you attempt to read too much.
     */
    public int read(final byte b[]) throws IOException {
        if (b.length + bytesRead > maxBytes) throw new IOException("File was too big.");
        else return wrappedInputStream.read(b);
    }
}

Тогда используйте этот класс так:

ImageIO.read(new InputStreamLimiter(new URL("http://server/image.png").openStream(),MAX_BYTES)));
1 голос
/ 04 сентября 2014

Более простой способ гарантировать, что вы не загрузите большой файл, - это использовать IOUTils.read :

    int maxDownload = 1024*1024*2;
    URL website = new URL("http://www.wswd.net/testdownloadfiles/200MB.zip");

    byte[] outBytes = new byte[maxDownload];
    InputStream stream = website.openStream();

    IOUtils.read(stream, outBytes, 0, maxDownload);

    if (stream.read() != -1) {
        System.out.println("File too big");
    } 

    IOUtils.write(outBytes, new FileOutputStream("200MB.zip"));
0 голосов
/ 14 декабря 2011

Я думаю, что вы можете использовать метод "mark" для InputStream и установить readlimit.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...