FrontPage  Index  Search  Changes  Login

Hiki Issue Tracking System - Ticket-71 Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

! attachでのメモリ浪費

:Priority:Normal
:Reporter:セケ
:Status:New
:Assigned to:?
:Version:
:Milestone:?
:Created:2006-09-05

!! Description

二重投稿になったらすみません。submitしてもwebが更新されないので。。

attacheプラグインでファイルサイズの大きい(300MB等)ファイルをアップする場合、ファイルを丸ごとreadするので、メモリーの少ないマシンではつらい状況です。こんな変更を入れてみましたので、もしよろしければご参考下さい。
<<<
diff -bB -ur org/misc/plugin/attach/attach.cgi new/misc/plugin/attach/attach.cgi
--- org/misc/plugin/attach/attach.cgi       Wed Jul 20 21:31:45 2005
+++ new/misc/plugin/attach/attach.cgi  Tue Sep  5 11:52:58 2006
@@ -48,12 +49,17 @@
        raise "File size is larger than limit (#{max_size} bytes)."
       end
       unless filename.empty?
-       content = params['attach_file'][0].read
+       buf_size = 8 * 1024
+       content = params['attach_file'][0].read(buf_size)
        if (!@conf.options['attach.allow_script']) && (/<script\b/i =~ content)
          raise "You cannot attach a file that contains scripts."
        else
+         params['attach_file'][0].pos = 0
          open(path.untaint, "wb") do |f|
+           content = ""
+           while params['attach_file'][0].read(buf_size,content)
            f.print content
+           end
          end
          r << "FILE        = #{File.basename(path)}\n"
          r << "SIZE        = #{File.size(path)} bytes\n"
diff -bB -ur org/misc/plugin/attach.rb new/misc/plugin/attach.rb
--- org/misc/plugin/attach.rb       Mon Jan 30 22:49:16 2006
+++ new/misc/plugin/attach.rb  Tue Sep  5 12:12:54 2006
@@ -103,13 +103,21 @@
     header = Hash::new
     header['Content-Type'] = mime_type
     header['Last-Modified'] = CGI::rfc1123_date(File.mtime(attach_file.untaint))
+    header['Content-Length'] = File.size(attach_file.untaint)
     if %r|^image/| =~ mime_type
       header['Content-Disposition'] = %Q|inline; filename="#{file_name.to_sjis}"; modification-date="#{header['Last-Modified']}";|
     else
       header['Content-Disposition'] = %Q|attachment; filename="#{file_name.to_sjis}"; modification-date="#{header['Last-Modified']}";|
     end
     print @cgi.header(header)  
-    print File.open(attach_file.untaint, 'rb').read
+    # print File.open(attach_file.untaint, 'rb').read
+    File.open(attach_file.untaint, 'rb'){|f|
+      buf_size = 8 * 1024
+      buf = ""
+      while f.read(buf_size,buf)
+        print buf
+      end
+    }
   else
     data = get_common_data( @db, @plugin, @conf )
     generate_error_page( data )

>>>

その他
* cgi.rbの問題であるが、/tmpにテンポラリファイルを作ってしまう。cgi.rbを変更する等して、ディスク容量の十分な場所にテンポラリファイルの作成を指示しましょう。
*  hikiconf.rbの@timeoutの値を十分に長くしないと、転送中にタイムアウトしてしまいます。

----
!! Changelog
{{its_edit_ticket_form}}