Rails 파일 업로드 filefield 오류 Encoding::UndefinedConversionError
9727 단어 Railsfile_field
- Started POST "/posts" for 106.3.102.43 at 2012-10-29 21:16:26 +0800
- Processing by PostsController#create as HTML
- Parameters: {"utf8"=>"✓", "authenticity_token"=>"QG8aU6/VW5ZMagzyGhjdbm7fSzr4MB5CKdJeGBIeOa4=", "post"=>{"category_id"=>"1", "title"=>"666666666666", "url"=>"6666666", "picture"=>#<ActionDispatch::Http::UploadedFile:0x000000032fb838 @original_filename=".gitconfig", @content_type="application/octet-stream", @headers="Content-Disposition: form-data; name=\"post[picture]\"; filename=\".gitconfig\"\r
Content-Type: application/octet-stream\r
", @tempfile=#<File:/tmp/RackMultipart20121029-2609-1lrmc9o>>, "content"=>"6666", "tags_attributes"=>{"0"=>{"title"=>""}}}, "commit"=>"Create Post"}
- Redirected to http://42.121.5.68/posts
- Completed 302 Found in 36ms (ActiveRecord: 30.1ms)
- Started POST "/posts" for 123.114.36.100 at 2012-10-30 08:58:13 +0800
- Processing by PostsController#create as HTML
- Parameters: {"utf8"=>"✓", "authenticity_token"=>"rRnhcDWYDn+OntxxC2LmIEHpSpjWI5glrs6JlprG1Ho=", "post"=>{"category_id"=>"1", "title"=>" ", "url"=>"post7", "picture"=>#<ActionDispatch::Http::UploadedFile:0x000000030df9a0 @original_filename=" .pdf", @content_type="binary/octet-stream", @headers="Content-Disposition: form-data; name=\"post[picture]\"; filename=\"\xE6\x96\xB0\xE6\xB5\xAA\xE5\xBE\xAE\xE5\x8D\x9A\xE6\x95\xB0\xE6\x8D\xAE\xE6\x8C\x96\xE6\x8E\x98\xE6\x96\xB9\xE6\xA1\x88.pdf\"\r
Content-Type: binary/octet-stream\r
", @tempfile=#<File:/tmp/RackMultipart20121030-16129-15agvlb>>, "content"=>" > ", "tags_attributes"=>{"0"=>{"title"=>" "}}}, "commit"=>"Create Post"}
- Completed 500 Internal Server Error in 45ms
-
- Encoding::UndefinedConversionError ("\xE2" from ASCII-8BIT to UTF-8):
- app/controllers/posts_controller.rb:60:in `write'
- app/controllers/posts_controller.rb:60:in `block (2 levels) in create'
- app/controllers/posts_controller.rb:59:in `open'
- app/controllers/posts_controller.rb:59:in `block in create'
- app/controllers/posts_controller.rb:56:in `create'
비교 후 두 단락의picture 부분의 @content 발견type이 다릅니다. 성공한 것은 @content 입니다.type="application/octet-stream", 실패한 것은 @contenttype="binary/octet-stream". txt 파일을 업로드하려고 시도합니다. 성공했습니다. @contenttype 부분은 @contenttype="text/plain". 이 부분의 원인, 즉 인코딩이 확실하기 때문에 인코딩 오류가 발생했고 인코딩 변환이 정의되지 않았습니다.
업로드 부분의 코드는 다음과 같다
- uploaded_io = params[:post][:picture]
- if uploaded_io != nil and uploaded_io.content_type.match('image')
-
- File.open(Rails.root.join('public','uploads',uploaded_io.original_filename),'w') do |f|
-
- f.write(uploaded_io.read)
- end
-
- else
- end
한차례의 검색을 통해 심층적인 원인을 찾았는데 원래는 2진 파일이었기 때문에 루비는 2진 파일을 읽고 저장할 때 자동으로 처리하기 때문에 특별한 방식이 필요하지 않았다.
그러나 윈도우즈에서는 2진법과 텍스트 파일이 다르기 때문에 2진법 모드에서 끝줄은 하나의 단독 줄로 전환될 수 없고, 하나의 리턴과 하나의 줄로 저장된다.그래서 만약에 바이너리 파일을 읽는다면 오픈할 때 바이너리 파일을 읽는다는 것을 명시해야 한다.b는 2진법이라는 뜻이다.
그림은 기본적으로 2진 파일로 처리되어 있어서 당첨되었다.사실 w를 wb로 바꾸면 돼요.
다음은 이 문제가 없다.
- uploaded_io = params[:post][:picture]
- if uploaded_io != nil and uploaded_io.content_type.match('image')
-
- File.open(Rails.root.join('public','uploads',uploaded_io.original_filename),'wb') do |f|
-
- f.write(uploaded_io.read)
- end
-
- else
- end
- <div class="field">
- <%= f.label :picture %><br/>
- <%= f.file_field :picture %>
- </div>
안전한 측면에서 볼 때 파일 업로드는 경로, 권한, 업로드의 유형을 엄격하게 제어해야 한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
새로운 UI의 Stripe Checkout을 Rails로 만들어 보았습니다.Stripe의 옛 디자인인 Stripe의 구현 기사는 많이 있습니다만, 지금 현재의 디자인에서의 도입 기사는 발견되지 않았기 때문에 투고합니다. Stripe의 체크아웃을 stripe의 문서라든지 stackoverfl...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.