1

ブラウザと Java SE アプリケーションで完全に機能するファイルの URL がありますが403 forbidden、サーブレットでエラーが発生します。以下は、Java SE プログラムとサーブレットの両方のコードです。

Java SE コード

public class UrlDownload {
    final static int size=1024;
    public static void fileUrl(){
        OutputStream outStream = null;
        URLConnection  uCon = null;

        InputStream is = null;
        try{
            URL Url;
            byte[] buf;
            int ByteRead,ByteWritten=0;
            Url= new URL("http://o-o---preferred---bharti-del2---v17---    lscache7.c.youtube.com/videoplayback?upn=6BFud0UQ_-0&sparams=cp%2Cgcr%2Cid%2Cip%2Cipbits%2Citag%2Cratebypass%2Csource%2Cupn%2Cexpire&fexp=900147%2C907217%2C922401%2C919804%2C920704%2C912806%2C906831%2C911406%2C913550%2C912706&key=yt1&itag=37&ipbits=8&signature=6EBF4572274A427AFF58E023CEC8B62439E0B914.BD6827306B81393BE3998FA0F0701E6F2701A3F8&mv=m&sver=3&mt=1345685891&ratebypass=yes&source=youtube&ms=au&gcr=in&expire=1345708167&ip=116.203.237.173&cp=U0hTSldLVl9LUUNOM19PRVpCOkV6WE5pcUF1NjQ5&id=9d8c9310d90eae67&quality=hd1080&fallback_host=tc.v17.cache7.c.youtube.com&type=video/mp4");
            outStream = new BufferedOutputStream(new
            FileOutputStream("video"));

            uCon = Url.openConnection();
            is = uCon.getInputStream();
            buf = new byte[size];
            while ((ByteRead = is.read(buf)) != -1)
            {
                System.out.println("Downloading file");
                outStream.write(buf, 0, ByteRead);
                ByteWritten += ByteRead;
            }
            System.out.println("Downloaded Successfully.");
        }catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                is.close();
                outStream.close();
            }catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

サーブレット コード

protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("video/mp4");
    String url=request.getParameter("url");
    URLConnection  con = null;

    BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
    InputStream in=null;
    byte[] buffer;
    int ByteRead,ByteWritten=0;
    try {
        URL dUrl=new URL(url);
        con=dUrl.openConnection();
        in=con.getInputStream();
        buffer = new byte[1024];
        while ((ByteRead = in.read(buffer)) != -1)
        {
            System.out.println("Downloading file");
            out.write(buffer, 0, ByteRead);
            ByteWritten += ByteRead;
        }   
    } finally {            
      out.close();
      in.close();
    }
}

urlは、これurlに a として与えられたものと同じですparameterservlet

4

1 に答える 1

1

YouTube のダウンロード URL は 1 回限りの使用を目的としています。最初に生成された IP 範囲にバインドされ、しばらくすると有効期限が切れます。ここで行ったように、アプリケーションでハードコーディングすると、避けられない失敗につながります。

于 2012-08-23T02:16:24.110 に答える