내가 사용하고 ASP.NET 웹 API를 .
API (API가 생성하는)에서 C #으로 PDF를 다운로드하고 싶습니다.
API가 반환하도록 할 수 있습니까 byte[]
? C # 응용 프로그램의 경우 다음을 수행 할 수 있습니다.
byte[] pdf = client.DownloadData("urlToAPI");?
과
File.WriteAllBytes()?
내가 사용하고 ASP.NET 웹 API를 .
API (API가 생성하는)에서 C #으로 PDF를 다운로드하고 싶습니다.
API가 반환하도록 할 수 있습니까 byte[]
? C # 응용 프로그램의 경우 다음을 수행 할 수 있습니다.
byte[] pdf = client.DownloadData("urlToAPI");?
과
File.WriteAllBytes()?
답변:
StreamContent가 포함 된 HttpResponseMessage를 내부에 반환하는 것이 좋습니다.
예를 들면 다음과 같습니다.
public HttpResponseMessage GetFile(string id)
{
if (String.IsNullOrEmpty(id))
return Request.CreateResponse(HttpStatusCode.BadRequest);
string fileName;
string localFilePath;
int fileSize;
localFilePath = getFileFromID(id, out fileName, out fileSize);
HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
response.Content = new StreamContent(new FileStream(localFilePath, FileMode.Open, FileAccess.Read));
response.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment");
response.Content.Headers.ContentDisposition.FileName = fileName;
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
return response;
}
patridge의 주석에서 UPD : 다른 사람이 실제 파일 대신 바이트 배열에서 응답을 보내려고 여기에 오면 StreamContent 대신 new ByteArrayContent (someData)를 사용하고 싶을 것입니다 ( 여기 참조 ).
new ByteArrayContent(someData)
것입니다 StreamContent
( 여기 참조 ).
다음 조치를 취했습니다.
[HttpGet]
[Route("api/DownloadPdfFile/{id}")]
public HttpResponseMessage DownloadPdfFile(long id)
{
HttpResponseMessage result = null;
try
{
SQL.File file = db.Files.Where(b => b.ID == id).SingleOrDefault();
if (file == null)
{
result = Request.CreateResponse(HttpStatusCode.Gone);
}
else
{
// sendo file to client
byte[] bytes = Convert.FromBase64String(file.pdfBase64);
result = Request.CreateResponse(HttpStatusCode.OK);
result.Content = new ByteArrayContent(bytes);
result.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment");
result.Content.Headers.ContentDisposition.FileName = file.name + ".pdf";
}
return result;
}
catch (Exception ex)
{
return Request.CreateResponse(HttpStatusCode.Gone);
}
}
와 예 IHttpActionResult
에서 ApiController
.
[HttpGet]
[Route("file/{id}/")]
public IHttpActionResult GetFileForCustomer(int id)
{
if (id == 0)
return BadRequest();
var file = GetFile(id);
IHttpActionResult response;
HttpResponseMessage responseMsg = new HttpResponseMessage(HttpStatusCode.OK);
responseMsg.Content = new ByteArrayContent(file.SomeData);
responseMsg.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment");
responseMsg.Content.Headers.ContentDisposition.FileName = file.FileName;
responseMsg.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
response = ResponseMessage(responseMsg);
return response;
}
PDF를 다운로드하지 않고 PDF 뷰어에 내장 된 브라우저를 사용하지 않으려면 대신 다음 두 줄을 제거하십시오.
responseMsg.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment");
responseMsg.Content.Headers.ContentDisposition.FileName = file.FileName;
var file = GetFile(id);
. file.SomeData
는 바이트 배열 ( byte[]
)이고 file.FileName
입니다 string
.
참고 사항 .Net Core
: 원시 바이트를 보내려면을 사용 FileContentResult
하고 contentType을로 설정할 수 있습니다 application/octet-stream
. 예:
[HttpGet("{id}")]
public IActionResult GetDocumentBytes(int id)
{
byte[] byteArray = GetDocumentByteArray(id);
return new FileContentResult(byteArray, "application/octet-stream");
}
FileContentResult
호출 되는 속성이 있습니다FileDownloadName
좀 더 ... "일반적인"방법으로 파일을 다운로드하는 간단한 방법이 있는지 궁금합니다. 나는 이것을 생각 해냈다.
ActionResult
을 반환하는 컨트롤러 호출에서 파일을 다운로드 할 수 있는 간단한 방법 입니다 IHttpActionResult
. 파일은 byte[] Content
. 필요한 경우 스트림으로 전환 할 수 있습니다.
나는 이것을 사용하여 데이터베이스의 varbinary 열에 저장된 파일을 반환했습니다.
public class FileHttpActionResult : IHttpActionResult
{
public HttpRequestMessage Request { get; set; }
public string FileName { get; set; }
public string MediaType { get; set; }
public HttpStatusCode StatusCode { get; set; }
public byte[] Content { get; set; }
public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
{
HttpResponseMessage response = new HttpResponseMessage(StatusCode);
response.StatusCode = StatusCode;
response.Content = new StreamContent(new MemoryStream(Content));
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
response.Content.Headers.ContentDisposition.FileName = FileName;
response.Content.Headers.ContentType = new MediaTypeHeaderValue(MediaType);
return Task.FromResult(response);
}
}