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 値は、クライアントが既に受信したファイルの部分の長さです。
しかし、これはまったく機能していないようです。サーバーから空のストリームを受け取ります。
このコードを機能させる方法、またはより良い方法を知っている人はいますか?