laravel上传文件到s3,打开链接无法下载而是直接在浏览器中显示内容

2 篇文章 0 订阅

问题描述:用laravel写了一个上传csv文件到s3的功能,在本地运行正常,但是到了测试环境却无法将上传成功后返回的s3链接直接下载,而是在浏览器中直接显示csv文件内容:

原代码:

Storage::disk('s3FileUpload')->put($path, file_get_contents(stream_get_meta_data($temp)['uri']), 'public');

改动后代码:(增加ContentType=> binary/octet-stream)

Storage::disk('s3FileUpload')->put($path, file_get_contents(stream_get_meta_data($temp)['uri']), [
            'visibility' => 'public',
            'ContentType' => 'binary/octet-stream'
]);

完整代码:

		$temp = tmpfile();
        $queryList = $request->input();
        $ids       = $request->get('ids', []);
        //检索数据
        $products = Product::select('test')->when(
            !empty($ids), function ($query) use ($ids) {
                return $query->whereIn('id', $ids);
            }, function ($query) use ($queryList) {
            if (empty($queryList)) {
                return $query->whereRaw('1=0');
            }
            return $query->applyFilter($queryList);
        })->orderBy('id', 'desc')->get()->toArray();
        if(empty($products)){
            return $this->responseError('products list is empty');
        }
        $productsExportList = $this->getProductsExportList($products);
        foreach ($productsExportList as $data) {
            fputcsv($temp, $data);
        }
        $path = 'labels/'.date("Y/m/d/"). uniqid('', true) . '.csv';
        Storage::disk('s3')->put($path, file_get_contents(stream_get_meta_data($temp)['uri']), [
            'visibility' => 'public',
            'ContentType' => 'binary/octet-stream'
        ]);
        fclose($temp);

        $url = Storage::disk('s3')->url($path);
        return $this->responseSuccess(["url" => $url], "success");
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要实现从 S3 下载文件并将其传输到浏览器的接口,你可以使用 Go 的标准库 `http` 和 AWS SDK for Go。以下是一个基本的示例代码: ```go package main import ( "fmt" "net/http" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/s3" ) func downloadHandler(w http.ResponseWriter, r *http.Request) { // 创建 AWS 会话 sess, err := session.NewSession(&aws.Config{ Region: aws.String("us-west-2"), }) if err != nil { http.Error(w, "Failed to create session", http.StatusInternalServerError) return } // 创建 S3 服务客户端 svc := s3.New(sess) // 获取要下载的文件名 filename := r.URL.Query().Get("filename") if filename == "" { http.Error(w, "Filename not provided", http.StatusBadRequest) return } // 从 S3 下载文件 downloader := s3.NewDownloader(sess) resp, err := downloader.Download(w, &s3.GetObjectInput{ Bucket: aws.String("my-bucket"), Key: aws.String(filename), }) if err != nil { http.Error(w, "Failed to download file", http.StatusInternalServerError) return } // 设置响应头,告诉浏览器下载的文件名和类型 w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=%s", filename)) w.Header().Set("Content-Type", *resp.ContentType) fmt.Println("File downloaded successfully") } func main() { http.HandleFunc("/download", downloadHandler) fmt.Println("Listening on :8080...") http.ListenAndServe(":8080", nil) } ``` 在上面的示例,我们定义了一个名为 `downloadHandler` 的函数,用于处理下载请求。首先,我们创建了一个 AWS 会话和 S3 服务客户端。然后,我们从请求参数获取要下载的文件名,并使用 `s3.NewDownloader` 函数创建了一个 S3 下载器。接下来,我们调用下载器的 `Download` 方法来将文件传输到 `http.ResponseWriter`,从而将文件内容发送到浏览器。最后,我们设置了响应头,告诉浏览器下载的文件名和类型。 在 `main` 函数,我们将 `downloadHandler` 函数注册为处理 `/download` 路径的请求处理程序。最后,我们使用 `http.ListenAndServe` 函数启动了 HTTP 服务器,监听在 `:8080` 端口上。 你需要将示例代码的 `my-bucket` 替换为你自己 S3 存储桶的实际值,并确保你有足够的权限来访问该存储桶和对象。在浏览器访问 `http://localhost:8080/download?filename=my-file.txt`,就可以下载名为 `my-file.txt` 的文件了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值