복붙노트

[RUBY-ON-RAILS] 어떻게 데이터베이스에 저장하지 않고, 사용자 업로드 된 파일을 읽기

RUBY-ON-RAILS

어떻게 데이터베이스에 저장하지 않고, 사용자 업로드 된 파일을 읽기

나는 (이하 100킬로바이트 이상) 사용자에 의해 업로드 된 XML 파일을 읽을 수 있지만 데이터베이스에 해당 파일 저장 첫째로하지 수 있도록하고 싶습니다. 나는 현재의 액션 과거 해당 파일을 필요가 없습니다 (그 내용은 구문 분석하고 데이터베이스에 추가됩니다하지만, 파일을 구문 분석하는 것은 문제가되지 않습니다). 이후 로컬 파일을 읽을 수 있습니다 :

File.read("export.opml")

다음에 그것을 읽으려고, uploaded_file : 난 그냥위한 file_field를 만드는 방법에 대해 생각

File.read(params[:uploaded_file])

그러나 않는 모두가 형식 오류를 (문자열로 HashWithIndifferentAccess을 변환 할 수 없습니다) 던질 것입니다. 난 정말 (물론 / tmp를 디렉토리에서 읽기를 포함한) 다양한 많은 것들을 시도하지만 작업에 그들 중 누구도를 얻을 수 있습니다.

내 질문의 간결함은 내가 내 자신에이 문제를 해결하려고 준 노력을 마스크하지 않는 희망,하지만 난 그것을 수행하는 방법에하지의 백 가지 방법으로이 문제를 오염 싶지 않았다. 에 차임 사람에게 큰 감사를드립니다.

여기 내도이다 :

<% form_for(:uploaded_file, @feed, :url => {:action=>'parse'}, :html=> {:multipart=>true}) do |f| %>  <p>
    <%= f.label :uploaded_file, 'Upload your file.' %><br />
    <%= f.file_field :uploaded_file %>
  </p>
  <p><%= f.submit 'upload' %></p>
<% end %>

내가 제출 한 후, 처리를 위해 다른 사용자 지정 작업 (구문 분석)에 오프 전달되는 file_field 업로드를 처리하는 사용자 지정 작업 (업로드)를 설정합니다. 이 내 문제의 일부가 될 수 있을까?

해결법

  1. ==============================

    1.당신은 매우 가깝습니다. [: uploaded_file] PARAMS의 클래스 유형을 확인 - 이미 파일의 역할을하고, 각각의 읽기 방법 (들)을 사용하여 읽을 수 있습니다 둘, 그것은 일반적으로 StringIO 또는 임시 파일 객체가 될 것이다.

    당신은 매우 가깝습니다. [: uploaded_file] PARAMS의 클래스 유형을 확인 - 이미 파일의 역할을하고, 각각의 읽기 방법 (들)을 사용하여 읽을 수 있습니다 둘, 그것은 일반적으로 StringIO 또는 임시 파일 객체가 될 것이다.

    그냥 확실하게 (PARAMS의 클래스 유형 [: uploaded_file] 당신이 등 잡종, 승객,에 WEBrick을 사용하는지에 따라 다를 수 있음)이 약간 더 철저한 시도 할 수 있습니다 :

    # Note: use form validation to ensure that
    #  params[:uploaded_file] is not null
    
    file_data = params[:uploaded_file]
    if file_data.respond_to?(:read)
      xml_contents = file_data.read
    elsif file_data.respond_to?(:path)
      xml_contents = File.read(file_data.path)
    else
      logger.error "Bad file_data: #{file_data.class.name}: #{file_data.inspect}"
    end
    

    [: uploaded_file, 귀하의 경우, 그것은 PARAMS이 밝혀 경우 해시가 있는지 확인보기에 file_field를 호출 할 때 당신은 mistakingly OBJECT_NAME 및 방법 매개 변수를 뒤집어하지 않았는지, 또는 서버가 당신에게 해시를 제공하지 않습니다 같은 키 : (.이 경우 development.log 파일 / production.log에서 나쁜 file_data이 게시물에 덧글 ... 출력을하시기 바랍니다) CONTENT_TYPE 등

  2. ==============================

    2.나는 YAML 파일을 읽을 필요가있다. 나는 remotipart 여기에 코드를 사용 :

    나는 YAML 파일을 읽을 필요가있다. 나는 remotipart 여기에 코드를 사용 :

    html.slim에서

     =form_tag('/locations/check_for_import', method: :post, remote: true, multipart: true)
    

    ...

    <input id="uploadInput" type="file" name="uploadInput">
    

    컨트롤러

    content = File.read(params[:uploadInput].tempfile)
    doc = YAML.load(content)
    
  3. from https://stackoverflow.com/questions/2521053/how-to-read-a-user-uploaded-file-without-saving-it-to-the-database by cc-by-sa and MIT license