1

C# の Web サービスに HTTP REST コマンドを送信する Java で実行されているクライアント アプリケーションがあります。

クライアントはサーバーからファイルをダウンロードし、非常にうまく機能します。

ファイル転送のコードは次のとおりです。

Java クライアント

public void downloadFile(String fileUrl, String fileName, String filePath) throws IOException{
        int bytesRead;
        URL url = new URL(fileUrl);

        BufferedInputStream bis = new BufferedInputStream(conn.getInputStream());
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filePath));
        byte[] fileBuffer = new byte[1024];
        while ((bytesRead = bis.read(fileBuffer)) != -1) {
            bos.write(fileBuffer, 0, bytesRead);
        }
        bos.close();
        bis.close();
    }

C# Web サービス

        [WebGet(UriTemplate = "SendFile/{clientID}/{fileName}")]
        public Stream sendFile(String clientID, String fileName)
        {
            WebOperationContext.Current.OutgoingResponse.Headers.Add(HttpResponseHeader.Expires, DateTime.UtcNow.ToString("ddd, dd MMM yyyy HH:mm:ss 'GMT'"));
            WebOperationContext.Current.OutgoingResponse.ContentType = "application/pdf";
            Stream ms = File.OpenRead(@jobRepPath + fileName.Replace("___", "."));
            return ms;
        }

今、これに基づいて、壊れたダウンロードのダウンロードを再開する方法を設定したいと思います。

私はこのコードを試しました:

Java クライアント

public void resumeBrokenDownload(String fileUrl, String fileName, String filePath, long fileLength) throws IOException{
        int bytesRead;
        URL url = new URL(fileUrl);

        BufferedInputStream bis = new BufferedInputStream(conn.getInputStream());
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filePath, true));

        byte[] fileBuffer = new byte[1024];     
        while ((bytesRead = bis.read(fileBuffer)) != -1) {
            bos.write(fileBuffer, 0, bytesRead);
        }
        bos.close();
        bis.close();
    }

C# Web サービス

        [WebGet(UriTemplate = "ResumeDownload/{clientID}/{fileName}/{startByte}")]
        public Stream resumeDownload(String clientID, String fileName, String startByte)
        {
            Stream ms = File.OpenRead(@jobRepPath + fileName.Replace("___", "."));
            var memoryStream = new MemoryStream();
            ms.CopyTo(memoryStream);
            Byte[] byteFile = memoryStream.ToArray();

            MemoryStream stream = new MemoryStream();
            stream.Write(byteFile, Convert.ToInt32(startByte), byteFile.Length);

            WebOperationContext.Current.OutgoingResponse.Headers.Add(HttpResponseHeader.Expires, DateTime.UtcNow.ToString("ddd, dd MMM yyyy HH:mm:ss 'GMT'"));
            WebOperationContext.Current.OutgoingResponse.ContentType = "application/pdf";
            return stream;
        }

REST URL で渡される startByte 値は、クライアントが既に受信したファイルの部分の長さです。

しかし、これはまったく機能していないようです。サーバーから空のストリームを受け取ります。

このコードを機能させる方法、またはより良い方法を知っている人はいますか?

4

1 に答える 1

0

このチュートリアルで見つかった例を適応させることで、最終的に問題を解決しました。

私のソリューションに興味がある人のために、c# Web サービスのコードを変更します。

        [WebGet(UriTemplate = "ResumeDownload/{clientID}/{fileName}/{startByte}")]
        public Stream resumeDownload(String clientID, String fileName, String startByte)
        {
            MemoryStream responseStream = new MemoryStream();
            Stream fileStream = File.Open(@jobRepPath + fileName.Replace("___", "."), FileMode.Open);

            fileStream.Seek(Convert.ToInt32(startByte), SeekOrigin.Begin);

            int length = (int)(fileStream.Length - Convert.ToInt32(startByte));
            byte[] buffer = new byte[length];
            fileStream.Read(buffer, 0, length);
            responseStream.Write(buffer, 0, length);

            fileStream.Close();
            responseStream.Position = 0;

            return responseStream; 
        }
于 2013-04-02T10:58:13.917 に答える