中国手机网站,企业网站托管方案内容具体有哪些,河南海华工程建设监理公司网站,wordpress怎么新建子域名服务器用的是ubuntu12 64bit#xff0c;环境是ruby1.9.3rails3mysql#xff0c;测试是在windows2003上。 上传一个【.gitconfig】文件#xff0c;没有问题#xff0c;上传【新浪微博数据挖掘.pdf】报错#xff0c;上传【back.jpg】报错。 下面是两段信息#xff0c;是从【… 服务器用的是ubuntu12 64bit环境是ruby1.9.3rails3mysql测试是在windows2003上。 上传一个【.gitconfig】文件没有问题上传【新浪微博数据挖掘.pdf】报错上传【back.jpg】报错。 下面是两段信息是从【log/production.log】中粘贴出来的。上面一段你是没有问题的日志下面一段是报错之后的日志。 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_tokenQG8aU6/VW5ZMagzyGhjdbm7fSzr4MB5CKdJeGBIeOa4, post{category_id1, title666666666666, url6666666, picture#ActionDispatch::Http::UploadedFile:0x000000032fb838 original_filename.gitconfig, content_typeapplication/octet-stream, headersContent-Disposition: form-data; name\post[picture]\; filename\.gitconfig\\r\nContent-Type: application/octet-stream\r\n, tempfile#File:/tmp/RackMultipart20121029-2609-1lrmc9o, content6666, tags_attributes{0{title}}}, commitCreate 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_tokenrRnhcDWYDnOntxxC2LmIEHpSpjWI5glrs6JlprG1Ho, post{category_id1, title博客尝试最新法宝, urlpost7, picture#ActionDispatch::Http::UploadedFile:0x000000030df9a0 original_filename新浪微博数据挖掘方案.pdf, content_typebinary/octet-stream, headersContent-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\nContent-Type: binary/octet-stream\r\n, tempfile#File:/tmp/RackMultipart20121030-16129-15agvlb, content博客尝试最新法宝, tags_attributes{0{title博客尝试最新法宝}}}, commitCreate 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_typeapplication/octet-stream失败的是content_typebinary/octet-stream。 尝试上传一个txt文件成功了content_type部分是content_typetext/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 经过一番查找找到了深层的原因原来是二进制文件的缘故ruby在读取和保存的时候会自动处理二进制文件不需要特殊的方式。 可是在windows中二进制和文本文件是不同的在二进制mode下结束行不能被转义为一个单独的换行而是被保存为一个回车和一个换行。所以如果读取的是二进制文件需要在open的时候要指明读取的是二进制文件wb。b就是二进制的意思。 图片默认按照二进制文件处理所以就中招了。其实也只需要把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 classfield % f.label :picture %br/ % f.file_field :picture % /div 从安全角度来讲文件上传要严格控制路径权限以及上传的类型。 路径就是文件在服务器的保存路径最好是单独路径不要放在根目录规划好文件夹还要做好重命名因为上传的人不知道服务器上面是不是存在同名的文件这就涉及文件实际的名称和用户需要看到的文件名的映射。 权限就是上传路径给用户的权限最好不要有执行权限只有读写权限就可以了。有必要的话需要划分用户文件夹来区分权限。保留一个公共文件夹。等等根据情况而定。 上传的类型上传文件肯定和一个场景相关一个场景可能只需要一类文件比如文档场景图片场景。最好在不同的场景控制不同的文件类型。执行文件要严格控制。 本文转自 virusswb 51CTO博客原文链接http://blog.51cto.com/virusswb/1042740如需转载请自行联系原作者