UE4Http发送PDF文件,使用Webform网页服务器接收并下载

UE4Http发送PDF文件

通过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接收并下载PDF

在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网页服务器接收并下载的方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值