You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

通过Curl上传CSV至Ruby on Rails后端仅传文件名问题求助

解决Curl上传CSV文件到Rails控制器仅获取文件名的问题

我来帮你搞定这个问题!你现在遇到的核心问题是curl命令的写法错误,导致你只是把文件名字符串传送给了后端,而没有实际上传文件本身。下面分两步帮你解决:

1. 修正Curl上传命令

你原来的命令curl -F "file=wb.csv"是把字符串wb.csv作为file参数的值发送,而不是上传文件。正确的写法需要在文件名前加上@符号,告诉curl要读取并上传该路径下的文件:

curl -F "file=@wb.csv" http://localhost:3000/api/v1/process_data?api_key=Dp9Kv7j1y-FYytd-tYsAsSNic3ox

如果你的wb.csv不在当前终端的工作目录下,需要填写完整的文件路径,比如:

curl -F "file=@/Users/yourname/Documents/wb.csv" http://localhost:3000/api/v1/process_data?api_key=Dp9Kv7j1y-FYytd-tYsAsSNic3ox

2. Rails控制器的正确处理

修正curl命令后,后端的params[:file]会变成一个ActionDispatch::Http::UploadedFile对象(包含文件内容、临时文件路径、文件名等信息),接下来你需要在控制器里正确处理这个文件:

第一步:配置Strong Parameters

确保你的控制器允许file参数通过强参数校验:

class Api::V1::GrowthUtilsController < ApplicationController
  def import_csv
    # 调用强参数方法
    uploaded_file = import_csv_params[:file]
    # ...后续处理逻辑
  end

  private

  def import_csv_params
    params.permit(:file, :api_key)
  end
end

第二步:读取并处理CSV内容

你可以通过uploaded_file.read获取文件的原始内容,再用Ruby的CSV库解析:

def import_csv
  uploaded_file = import_csv_params[:file]

  if uploaded_file.present?
    # 解析CSV,根据你的需求设置headers(比如是否有表头)
    csv_data = CSV.parse(uploaded_file.read, headers: true)
    
    # 这里写你的业务逻辑,比如遍历csv_data处理每一行
    csv_data.each do |row|
      # 示例:打印每一行数据
      puts row.inspect
    end

    render json: { status: "success", message: "CSV文件上传并处理完成" }, status: :ok
  else
    render json: { status: "error", message: "请上传有效的CSV文件" }, status: :bad_request
  end
end

验证参数是否正确

你可以在控制器里先打印参数信息,确认文件已正确上传:

def import_csv
  puts params[:file].inspect
  # ...其他逻辑
end

正确的输出应该类似:

#<ActionDispatch::Http::UploadedFile:0x0000000108d2c8d0 @tempfile=#<Tempfile:/var/folders/xx/xxxx/T/RackMultipart20240520-xxxx-xxxx.csv>, @original_filename="wb.csv", @content_type="text/csv", @headers="Content-Disposition: form-data; name=\"file\"; filename=\"wb.csv\"\r\nContent-Type: text/csv\r\n">

这样就能成功上传并处理CSV文件啦!

内容的提问来源于stack exchange,提问作者Cyzanfar

火山引擎 最新活动