赞
踩
通过Http发送PDF文件,主要是将PDF文件转换成二进制字节数据存入HTTP报文的content字段。难点在于设置报文的头部以及body字段。
例如,如果想要发送一个txt文件,具体的报文如下:
POST http://localhost:3000/uploadArray HTTP/1.1
Host: localhost:3000
Connection: keep-alive
Content-Length: 378
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarymJztPE4VDNjFSyMs
Cookie: aclDemo=s%3A6EnRWWC4ayNlzrHjJ5oChupxpJk39bVO.wIwwsbkRndj9phHxPqsyNDYrgTrWv4nk2qEzUBb9tuI
------WebKitFormBoundarymJztPE4VDNjFSyMs
Content-Disposition: form-data; name=“myFiles”; filename=“file1.txt”
Content-Type: text/plain
AAAAAAAAAAAAAAAAAAAAAAAA
------WebKitFormBoundarymJztPE4VDNjFSyMs
Content-Disposition: form-data; name=“myFiles”; filename=“file2.txt”
Content-Type: text/plain
BBBBBBBBBBBBBBBBBBBBBBBBBb
------WebKitFormBoundarymJztPE4VDNjFSyMs–
代码中,主要需要设置的就是Content-Type: multipart/form-data; boundary=----WebKitFormBoundarymJztPE4VDNjFSyMs这部分的字段(一般来说常常在需要发送文件或者需要发送文件加文本的时候我们才会使用FromData类型的数据格式来发送),以及之后的boundary分割开的文件内容的字段,也就是Content-Disposition到boundary之间的部分,里面存放的就是具体的文件字节数据。
具体代码如下:
TArray<uint8> FileData; FFileHelper::LoadFileToArray(FileData, *FilePath); // 构造 HTTP 请求 TSharedRef<IHttpRequest,ESPMode::ThreadSafe> HttpRequest = FHttpModule::Get().CreateRequest(); HttpRequest->SetVerb("POST"); HttpRequest->SetURL(Url); FString Boundary = "---------------------------" + FString::FromInt(FDateTime::Now().GetTicks()); HttpRequest->SetHeader(TEXT("Content-Type"), TEXT("multipart/form-data; boundary =" + Boundary)); HttpRequest->SetVerb(TEXT("POST")); //The bit array format of the request's content TArray<uint8> RequestContent; // The bit array format of a single file TArray<uint8> FileContent; if (FFileHelper::LoadFileToArray(FileContent, *FilePath)) { // Begin Boundry FString BeginBoundry = "\r\n--" + Boundary + "\r\n"; RequestContent.Append((uint8*)TCHAR_TO_ANSI(*BeginBoundry), BeginBoundry.Len()); // File Header FString FileHeader = "Content-Disposition: form-data;name=\"myFile\";"; FileHeader.Append("filename=\"" + FPaths::GetCleanFilename(FilePath) + "\"\r\n"); FileHeader.Append("Content-Type: \r\n\r\n"); RequestContent.Append((uint8*)TCHAR_TO_ANSI(*FileHeader), FileHeader.Len()); // File Content RequestContent.Append(FileContent); } // End Boundry FString EndBoundary = "\r\n--" + Boundary + "--\r\n"; RequestContent.Append((uint8*)TCHAR_TO_ANSI(*EndBoundary), EndBoundary.Len()); HttpRequest->SetContent(RequestContent); HttpRequest->OnProcessRequestComplete().BindUObject(this, &UPDFHttpAsyncActionBase::HandleRequestNameRequest); HttpRequest->ProcessRequest();
在webform窗体程序中,接收http中的文件主要通过Request的Files属性,该属性返回的是一个 HttpFileCollection类型的数据,可以通过键值对的方式获取对应的文件数据。具体代码如下:
public void UploadPDF(HttpContext context) { // 获取上传的文件 HttpFileCollection file = context.Request.Files; if (file != null && file.Count > 0) { // 指定保存文件的路径 String dirPath = @"D:\upload\"; if (!Directory.Exists(dirPath)) { Directory.CreateDirectory(dirPath); } string path = dirPath + file["myFile"].FileName; file["myFile"].SaveAs(path); // 将文件保存到指定路径 /*using (var stream = new FileStream(path, FileMode.Create)) { file.CopyToAsync(stream); }*/ context.Response.StatusCode = 200; context.Response.ContentType = "text/plain"; context.Response.Write(path); } else { context.Response.StatusCode = 400; context.Response.ContentType = "text/plain"; if (file != null) { context.Response.Write("FileLengisNull"); } else { context.Response.Write("FileIsNull"); } // context.Response.WriteAsync("Invalid request."); } }
上述例子为一个一般应用程序,file[“myFile”]中的myfile必须是和http请求中的name字段一样,就是上面UE代码 FString FileHeader = “Content-Disposition: form-data;name=“myFile”;”;中的name字段。
file[“myFile”]返回的是一个HttpPostedFile类型的数据,这个类型下面的SaveAs方法可用于存储文件。需要注意的是,这个函数的参数是一个绝对路径,并且如果路径中的文件夹名字不存在,不会自动新建一个文件,而是直接报错,所以使用的时候需要确保文件夹存才,因此在保存之前我加了一个路径判断的逻辑if (!Directory.Exists(dirPath))
以上就是UE4Http发送PDF文件,使用Webform网页服务器接收并下载的方法。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。