POST请求responseType“数组缓冲区”是不是可行?

Posted

技术标签:

【中文标题】POST请求responseType“数组缓冲区”是不是可行?【英文标题】:Is it posible to POST request the responseType "array buffer"?POST请求responseType“数组缓冲区”是否可行? 【发布时间】:2021-08-25 02:00:30 【问题描述】:

我制作了一个将返回图像的 api。起初我在 get 方法请求上尝试过它并且它可以工作,但出于安全原因,我需要让它发布方法,但 post 不像我的 get 方法那样工作。您是否认为 responseType 仅在 get 方法中可用,因为它不适用于我的 post 方法?

这是我使用 get 方法的代码:

前端:

export const getImageFile = async (imageName) => 
    try 
      const  data  = await axios.get(`$apiUrl/image/$imageName`,
        responseType: "arraybuffer",
      );
      const image = new Buffer.from(data, "binary").toString("base64");
      return `data:image/png;base64, $image`;
     catch (err) 
      alert("File not found.");
    
  ;

后端(php symfony):

/**
     * @Route("/api/graph/image/imageName", methods="GET", name="get- image-graph")
     */
    public function getImage($imageName)
    
        try 
            $file = $this->parameterBag->get('kernel.project_dir').'/public/graphImage/graphs/'.$imageName;
            $response = new BinaryFileResponse($file);
            return $response;
         catch (\Exception $e) 
            return $this->json(['error' => 'File not found'], JsonResponse::HTTP_NOT_FOUND);
        
    

当我使用不起作用的 POST 方法时,这是我的代码:

前端:

export const getImageFile = async (imageName) => 
    try 
      const  data  = await axios.post(`$apiUrl/image`,
        responseType: "arraybuffer",
        "imageName": imageName,
      );
      const image = new Buffer.from(data, "binary").toString("base64");
      return `data:image/png;base64, $image`;
     catch (err) 
      alert("File not found.");
    
  ;`

backend: 

```php    
    /**
     * @Route("/api/graph/image", methods="POST", name="get-image- 
     graph")
     */
    public function getImage(Request $request)
    
        try 
            $content = json_decode($request->getContent(), true);
            $imageName = $content["imageName"];
            $file = $this->parameterBag->get('kernel.project_dir') 
            .'/public/graphImage/graphs/'.$imageName;
            $response = new BinaryFileResponse($file);
            return $response;
         catch (\Exception $e) 
            return $this->json(['error' => 'File not found'], 
            JsonResponse::HTTP_NOT_FOUND);
        
    `

【问题讨论】:

对于 post 方法使用 $image = $_POST["imageName"] 因为你不是将它作为 json 发送 我根据我的前端请求将其作为 json 发送。我根据 devtool(成功请求)获取图像,但它没有出现在我的前端。当我在帖子上尝试时,我认为我的 responseType 不起作用。 headers: "Content-Type": "application/json" 不在您的发帖请求中。所以试试 $image = $_POST["imageName"] 我试过但它会导致错误。 试试我的答案,让我知道 【参考方案1】:

来自Documentation,

axios.post(url, data, config)

您的发帖请求:

const  data  = await axios.post(`$apiUrl/image`,
        responseType: "arraybuffer",
        "imageName": imageName,
      );

您似乎混合了数据和配置。所以你的帖子请求应该是

const data = await axios.post(
    `$apiUrl/image`,
    
        "imageName": imageName,
    ,
    
        responseType: "arraybuffer"
    
);



// In server side php,you access it like
$image = $_POST["imageName"];

如果您想以 json 格式发送,请在配置中使用标头

    
        responseType: "arraybuffer",
        headers: 'Content-Type': 'application/json'
    

【讨论】:

嗨 Indra,我只是混合了数据和配置,在我分离之后,它就像魔术一样工作。感谢您的帮助 非常感谢 :) 作为初学者,我从您那里学到了很多东西。

以上是关于POST请求responseType“数组缓冲区”是不是可行?的主要内容,如果未能解决你的问题,请参考以下文章

详解get与post请求方式content-type与responseType@Requestbody与@Requestparam的使用场景

XHR post请求下载文件

Typescript 定义 POST 请求响应的类型

文件下载post请求,返回文件流转换zip,

vue Excel导出 [post请求+提示语]

前端axios请求, 后端接口返回文件流,完成下载