Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Ruby On Rails > проблемы с загрузкой файлов


Автор: RedAlliance 14.2.2011, 22:35
здравствуйте,у меня проблема с загрузкой файлов пользователем..а именно,получаю ошибку:

Invalid argument - public/uploaded_files/11.JPG-aiv000-Mon Feb 14 22:24:59 +0300 2011

RAILS_ROOT: D:/InstantRails/rails_apps/dip_project4
Application Trace | Framework Trace | Full Trace 
app/models/uploadedfile.rb:10:in `initialize'
app/models/uploadedfile.rb:10:in `open'
app/models/uploadedfile.rb:10:in `save'
app/controllers/home_controller.rb:283:in `upload_file'

в контроллере:(home_controller.rb)
Код
 def upload_file
      log_user()
      update()

      @course_visible = params[:course]
      @single_user = params[:accept]
      @confirm = params[:course_confirm]

      post = Uploadedfile.save(params[:upload],cookies[:username],@single_user,@course_visible,@confirm)
      flash[:uploaded] = "The file was successfully uploaded!"
      redirect_to :back
    end

в модели:(uploadedfile.rb)
Код
def self.save(upload,username,visible,course,confirm)
        @original = upload['datafile'].original_filename
        @name =  upload['datafile'].original_filename + "-" + username + "-" + Time.now().to_s
        directory = "public/uploaded_files"
        path = File.join(directory, @name)
        File.open(path, "wb") { |f| f.write(upload['datafile'].read)}

        if (confirm != nil)
            @courses = Course.find(:all,:conditions => ["course_name = ?", course])

            @courses.each do |show|
                @uploaded = Uploadedfile.new
                @filepath = directory + "/" + @name
                @size_of_file = File.size(@filepath)
                @uploaded.username = show.username
                @uploaded.original_filename = @original
                @uploaded.disc_filename = @name
                @uploaded.file_size = (@size_of_file/1024)
                @uploaded.save
          end
...
end


сделано практически как в тьюториале http://www.tutorialspoint.com/ruby-on-rails/rails-file-uploading.htm
но почему-то не работает..у кого-нибудь были такие же проблемы?как исправить?

Автор: synaptic 15.2.2011, 10:45
Может быть стоит посмотреть в сторону paperclip?  smile 

https://github.com/thoughtbot/paperclip

Автор: RedAlliance 24.2.2011, 00:58
проблема остаётся актуальной...
в коде ничего не изменилось..
ошибка следующая:
Invalid argument - public/uploaded_files/ReleaseNotes.txt-ama002-Thu Feb 24 00:44:57 +0300 2011

RAILS_ROOT: D:/InstantRails/rails_apps/dip_project4
Application Trace | Framework Trace | Full Trace 
app/models/uploadedfile.rb:9:in `initialize'
app/models/uploadedfile.rb:9:in `open'
app/models/uploadedfile.rb:9:in `save'
app/controllers/home_controller.rb:288:in `upload_file'
Request

Parameters: 
{"commit"=>"Upload",
 "accept"=>["ama001"],
 "authenticity_token"=>"6a6a510c0d90d66256297ab5b637e4195a2f9d8e",
 "upload"=>{"datafile"=>#<ActionController::UploadedStringIO:0x3fdd1c8>},
 "course"=>"Mathematical Analysis-1.1",
 "group"=>""}
что-то мне не нравится 
 "upload"=>{"datafile"=>#<ActionController::UploadedStringIO:0x3fdd1c8>},
то есть это хэш,как я понимаю..почему так получается??

Автор: DeTeam 25.2.2011, 16:08
Тут все нормально, видимо проблема в имени файла:

File.open(path, "wb") { |f| f.write(upload['datafile'].read)}


тут же ошибка вылезает ?

Автор: RedAlliance 26.2.2011, 22:51
да,ошибка там..но что такое может быть с именем файла?потому что так вылезает при выборе любого файла...

Автор: DeTeam 27.2.2011, 20:39
поменяйте строчку на

@name = "#{Time.now.to_i}_#{username}_#{upload['datafile'].original_filename}"

Автор: RedAlliance 27.2.2011, 21:46
спасибо вам большое smile 

Автор: RedAlliance 16.3.2011, 20:21
при загрузке файлов слегка поменяла в связи с русскими буквами код в uploadfile.rb:
Код
if visible != nil
            puts "#{visible.mb_chars.length}"
            if (visible.mb_chars.length >= 6)#username consists of 6 bytes(3 bytes for letters + 3 bytes for digits).    
                until visible == nil or visible == "" 
                    @uploaded = Uploadedfile.new
                    @filepath = directory + "/" + @name
                    @size_of_file = File.size(@filepath)
                    if visible.mb_chars[visible.mb_chars.length - 1].to_s == " " or visible.mb_chars[visible.mb_chars.length - 1].to_s == ";" or visible.mb_chars[visible.mb_chars.length - 1].to_s == ","
                     @uploaded.username = visible.mb_chars[visible.mb_chars.length - 7,6].to_s
                     puts "with #{@uploaded.username}"
                     visible = visible.mb_chars[0, visible.mb_chars.length - 7].to_s    
                    else
                     @uploaded.username = visible.mb_chars[visible.mb_chars.length - 6,6].to_s
                     puts "without #{@uploaded.username}"
                     visible = visible.mb_chars[0, visible.mb_chars.length - 6].to_s    
                    end                                                
                    @uploaded.original_filename = @orginal
                    @uploaded.disc_filename = @name
                    @uploaded.file_size = (@size_of_file/1024)
                    @uploaded.save
                end
            end
            
        end


в контроллере не меняла:
Код
def upload_file
      log_user()
      update()
      
      @user = User.find(:first, :conditions => ["username = ?", cookies[:username]])
      @group_visible = params[:group]
      @users = params[:accept].to_s
    
  
      if not (@group_visible == nil and @users == nil and params[:datafile] == nil and params[:upload] == nil)
        post = Uploadedfile.save(params[:upload],@user.username,@users,@group_visible)
        flash[:uploaded] = "Файл был успешно загружен!"
      end
      
      redirect_to :back
    end


при этом с латиницей нормально работало:загружало тем,кого указал,а теперь ещё и лишним,а именно: почему-то всем преподам(userclass=1)-не понимаю,откуда???

Автор: RedAlliance 20.3.2011, 18:48
проблема решена в теме "русские буквы" smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)