2011-12-05 10 views
6

kodu używam:nie można odczytać pliku z funkcją send_file w Rails 3

Biorąc pliku:

<%= link_to "Download", download_image_path(image) %> 

kontroler:

def download 
    @image = Image.find(params[:id]) 
    send_file "#{RAILS_ROOT}/public" + @image.attachment.url 
end 

ja dostaję błąd:

Cannot read file /Users/mohit/projects/my_app/public/system/attachments/4/original/Screen Shot 2011-11-04 at 3.14.03 PM.png?1320582022 

PS: dwukrotnie zaznaczone, plik istnieje. Ten sam problem na serwerze, dla wszystkich plików (obrazów, plików pdf, wideo) we wszystkich odpowiednich kontrolerach.

Odpowiedz

15

kwestią było:

używałem

@image = Image.find(params[:id]) 
send_file "#{RAILS_ROOT}/public" + @image.attachment.url 

Należy

@image = Image.find(params[:id]) 
send_file @image.attachment.path 

PS: Upewnij się potwierdzić, że obraz/zapis istnieje.

+0

jeśli przeanalizujesz kod przy użyciu hamulca, to pokaże on błąd jako atrybut MOdel używany jako nazwa pliku. po prostu uruchom hamulec. jego rozważanie jako send_file Image.find (parametry [: id]). Uploaded_file.path – errakeshpd

0

Czy to ?1320582022 należy do nazwy pliku? Nie jestem pewny, czy białe spacje w nazwie pliku mogą być potrzebne, czy też muszą zostać usunięte.

+0

Zrzut ekranu 2011-11-04 o 3.14.03 PM.png to nazwa pliku oraz 1320582022 idzie im coraz przyczyna problemu w trybie rozwoju .. –

1

nie wiem jak zapisać obraz mocowania URL, ale w ogóle, nazwa pliku powinna lubię:

/Users/mohit/projects/my_app/public/system/attachments/4/original/Screen Shot 2011-11-04 at 3.14.03 PM.png 

Wskazówka nie ma w końcu „xxxxx?”.

Możesz sprawdzić swój system plików, czy nazwa pliku to "Zrzut ekranu 2011-11-04 o 3.14.03 PM.png" lub "Zrzut ekranu 2011-11-04 o 3.14.03 PM.png? 1320582022 ".

Dla adresu URL pliku może to być coś takiego: http://example.com/xxx?dddd, który znak "?" podziel ścieżkę i parametry. Ciąg "dddd" jest parametrem, gdy ścieżka URL żądania, nie jest częścią ścieżki lub nazwy pliku. Parametry obsługiwane są tylko w adresie URL, a nie w lokalnej nazwie pliku.

Tak więc, myślę, że trzeba sprawdzić kod zapisywania adresu URL załącznika obrazu, który musi wykluczyć parametry i tylko nazwę pliku. Upewnij się, że nazwa jest dokładnie taka sama, jak plik zapisany na dysku.

I można spróbować otworzyć plik choć IRB bezpośrednio i sprawdzić wyjście:

>>> irb 
irb> f = open('/Users/mohit/projects/my_app/public/system/attachments/4/original/Screen Shot 2011-11-04 at 3.14.03 PM.png?1320582022') 

Inni starają się znaleźć lokalizację błędu w send_file i sprawdzić nazwę pliku.

Nadal nie mogę się upewnić, co to naprawdę jest, tylko niektóre sugestie.

+0

To była dobra sugestia ... –

2

Wystarczy zmienić metodę URL przez ścieżkę:

send_file @image.attachment.path # this is the right way!. 
Powiązane problemy