Rails 5中读取表单上传CSV文件失败求助
解决你Rails读取上传CSV文件失效的问题
嘿,我看了你的代码和参考过的问题,核心问题出在你处理上传文件的方式上——你完全没必要手动创建Tempfile来处理这个上传文件!
在Rails里,params[:search_file]本身就是一个ActionDispatch::Http::UploadedFile对象,它已经封装了上传文件的所有信息(包括文件路径、内容)。你现在新建的Tempfile其实是空的,自然读不到任何CSV数据,这就是为什么之前的方案都没生效的原因。
修正后的完整代码
def upload_file # 直接获取上传的文件对象,不用再创建Tempfile uploaded_file = params[:search_file] # 先做基础验证,确保文件存在且是CSV unless uploaded_file.present? && (uploaded_file.content_type == 'text/csv' || uploaded_file.extname.downcase == '.csv') render json: { status: 'error', message: '请上传有效的CSV文件' } return end # 读取文件内容,指定编码避免乱码问题 csv_text = File.read(uploaded_file.path, encoding: 'utf-8') # 解析CSV,headers: true会把第一行识别为表头 csv = CSV.parse(csv_text, headers: true) # 遍历每一行处理(这里替换成你的实际业务逻辑) csv.each do |row| puts row # 比如可以改成 Model.create(row.to_h) 之类的操作 end render json: { status: 'success', message: 'CSV文件处理完成' } end
额外优化建议
- 如果你的CSV文件比较大,建议用
CSV.foreach逐行读取,避免一次性把整个文件加载到内存,性能更好:CSV.foreach(uploaded_file.path, headers: true, encoding: 'utf-8') do |row| # 逐行处理逻辑 puts row end - 记得确保你的表单设置了
enctype="multipart/form-data"属性,否则Rails无法正确接收上传的文件。
内容的提问来源于stack exchange,提问作者user5136425
相关产品推荐
相关产品推荐

