2012-07-16 66 views
0

當我想通過file_field選擇一個文件時,它給了我錯誤,我的文件是'零'。這裏的錯誤:「沒有這樣的文件或目錄 - Book1.csv」導入CSV - 沒有這樣的文件或目錄

我可以知道爲什麼嗎?下面是代碼:

控制器

def import_csv 
@list = List.find(params[:list_id]) 
@lists = List.all 

respond_to do |format| 

@csv_text = File.read(params[:list][:file]) 
@csv = CSV.parse(@csv_text, :headers => true) 
@n=0 
@csv.each do | row | 
    @user_new = User.new 
    @user_new.first_name = row[0] 
    @user_new.last_name = row[1] 
    @user_new.email = row[2] 
    @user_new.company = row[3] 
    @user_new.address = row[4] 
    @user_new.city = row[5] 
    @user_new.state = row[6] 
    @user_new.zipcode = row[7] 
    @user_new.country = row[8] 
    @user_new.notes = row[9] 
    @user_new.birthday = row[10] 
    @user_new.home_number = row[11] 
    @user_new.mobile_number = row[12] 
    @user_new.list_id = @list.id 
    @user_new.save 

    @list.subscribers += 1 
    @list.save 
    @[email protected]+1 
    GC.start if @n%50==0 
    flash[:notice] = "CSV Imported Successfully, with #{@n} records"         
end 

    format.html { redirect_to lists_url } 
    format.json { head :no_content } 
end 
    end 

視圖

<%= form_for(:list, :url => list_import_csv_path(@list), :method => :get, :html => {:multipart => true}) do |f| %> 
<table> 
    <tr> 
     <td><label for="dump_file">Select a CSV File :</label></td> 
     <td><%= f.file_field :file %></td> 
    </tr> 
    <tr> 
     <td colspan='2'><%= submit_tag 'Import from CSV file' %></td> 
    </tr> 
</table> 
<% end %> 

回答

1

這是因爲你嘗試通過ActionDispatch::Http::UploadedFile對象作爲一個路徑,而不是真實路徑。你這樣做:

@csv_text = File.read(params[:list][:file]) 

你應該做的:

@csv_text = File.read(params[:list][:file].tempfile.to_path.to_s) 

此外,當您上傳的不是那麼小文件可能是你使用:method => :get問題。 Genereally GET和File Upload arent such such a great combination。^^

+0

嗯..這是有道理的,但現在我得到了錯誤:「未定義的方法'臨時文件」的‘Book1.csv’:字符串」有什麼我需要做的,讓這種方法的調用? – user1480797 2012-07-17 14:46:03

+1

嘗試使用後,而不是得到 – davidb 2012-07-17 15:08:19

+0

omg你是一個救生員!哈哈哈現在有用!非常感謝! :d – user1480797 2012-07-17 15:14:08

0

2017/6/27 - 希望如果他們處於和我一樣的狀況,有人會從中受益。

事實證明,而我有:

= form_tag action: :bulk_upload_submit, multipart: true do 
    ... 
      = file_field_tag :file, accept: 'text/csv' 

並將其發送文件PARAMS爲:

"file"=>"subscribers.csv"

我需要改變的form_tag使用的路徑,而不是一個動作:

= form_tag upload_subscribers_path, multipart: true do

這改變了PARAMS到:

"file"=> 
    #<ActionDispatch::Http::UploadedFile:0x007ffda857b5e0 
    @content_type="text/csv", 
    @headers="Content-Disposition: form-data; name=\"file\"; filename=\"subscribers.csv\"\r\nContent-Type: text/csv\r\n", 
    @original_filename="subscribers.csv", 
    @tempfile=#<File:/var/folders/_4/50fjk9z57x544klj30k0g1780000gn/T/RackMultipart20170627-33947-12xwfow.csv>> 
相關問題