解决nginx + lua 上传文件问题

本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/49509123 未经博主允许不得转载。
博主地址是:http://blog.csdn.net/freewebsys

1,首先不能创建upload对象

直接报错

failed to new upload: request body already exists

参考这个博客:
http://my.oschina.net/timingbob/blog/164231
就是request body 不能被使用2次造成的。

因为之前使用过一个叫 lua_need_request_body 显示 respons的post信息,和这个冲突了。去掉就好了。

这个博客上面有详细写,如何将post信息写到日志里面。
http://blog.csdn.net/jom_ch/article/details/15359129

去掉就好了。

2,将上传日志写到磁盘

参考:http://blog.csdn.net/langeldep/article/details/9628819
上面已经写的很详细了。

package.path = '/usr/local/share/lua/5.1/?.lua;/usr/local/openresty/lualib/resty/?.lua;'
package.cpath = '/usr/local/lib/lua/5.1/?.so;'

local upload = require "upload"

local chunk_size = 4096  --如果不设置默认是4096.
local form = upload:new(chunk_size)
local file
local filelen=0
form:set_timeout(0) -- 1 sec
local filename

function get_filename(res)
    local filename = ngx.re.match(res,'(.+)filename="(.+)"(.*)')
    if filename then
        return filename[2]
    end
end

local osfilepath = "/usr/local/openresty/nginx/html/"
local i=0
while true do
    local typ, res, err = form:read()
    if not typ then
        ngx.say("failed to read: ", err)
        return
    end
    if typ == "header" then
        if res[1] ~= "Content-Type" then
            filename = get_filename(res[2])
            if filename then
                i=i+1
                filepath = osfilepath  .. filename
                file = io.open(filepath,"w+")
                if not file then
                    ngx.say("failed to open file ")
                    return
                end
            else
            end
        end
    elseif typ == "body" then
        if file then
            filelen= filelen + tonumber(string.len(res))
            file:write(res)
        else
        end
    elseif typ == "part_end" then
        if file then
            file:close()
            file = nil
            ngx.say("file upload success")
        end
    elseif typ == "eof" then
        break
    else
    end
end
if i==0 then
    ngx.say("please upload at least one file!")
    return
end

这里需要注意一个问题,
/usr/local/openresty/nginx/html/文件夹必须是nobody权限,否则不能写文件,报错。

chown nobody:nobody /usr/local/openresty/nginx/html

上传啥都行了,也可以是图片,文件。

3,总结

本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/49509123 未经博主允许不得转载。
博主地址是:http://blog.csdn.net/freewebsys

lua+nginx上传速度还是非常快的。而且很轻量。

时间: 2024-10-22 03:51:59

解决nginx + lua 上传文件问题的相关文章

Android 解决WebView无法上传文件的问题

Android 解决WebView无法上传文件的问题 Android原生的WebView并不支持上传文件,需要我们自己实现相应的方法.于是我把工作中的相关代码记录下来.下次直接拿来用就行了.一点一滴都是经验. 1.需要定义三个变量 private ValueCallback<Uri[]> uploadMessageAboveL; private final static int FILE_CHOOSER_RESULT_CODE = 10000; private ValueCallback<

Nginx无法上传文件或者time out的解决办法

我们利用phpmyadmin上传一个1MB的文件时没有任何问题,但在上传20MB时发现提示 错误日志为: 413 Request Entity Too Large [error] 24225#0: *44 client intended to send too large body: 20MB, client: x.x.x.x, server: _, request: "POST /phpmyadmin/import.php HTTP/1.1", host: "111cn.n

struct上传文件怎么获取文件的路径

问题描述 struct上传文件怎么获取文件的路径 getUploadFileName()只能获取到文件名,如abc.xls 要怎么获取它的路径C://efg/abc.xls ??? 解决方案 浏览器不会传文件在用户客户端的路径给服务器,所以没有任何办法可以获取. 除非你限制你的客户端只使用特定的操作系统.浏览器.比如用IE+ActiveX,用FSO. 搞清楚一个问题,为什么你要做 web,而不是一个c/s结构的程序,你既然是web,你就应该遵循web的规则,并且接受它的限制. 解决方案二: 获取

解决nginx+php-fpm无法上传文件问题

  解决办法 location ~ .php$ { root /var/www/html/public; client_max_body_size 50M; client_body_temp_path /tmp; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params;

Nginx走HttpProxy连JBoss在上传文件时的一个bug,及其解决

问题描述: Nginx作为前端HttpServer 使用HttpProxy与JBoss进行连接在上传比较大的文件时,JBoss已经返回结果,但是Nginx不立即将结果返回给浏览器,直到Nginx的HttpProxy与JBoss因为超时而断开后才返回结果给浏览器 这样导致的结果就是用户觉得上传文件需要很长时间. 问题原因分析: Nginx HttpProxy转发的请求是Http 1.0的,就是说是不支持Keep-Alive的,那么也就是说只有当JBoss主动断开与HttpProxy的连接,或是超时

网站空间无法使用swfupload上传文件解决办法

使用swfupload上传$_FILES变量一直为空 今天使用了万网的M3型虚拟主机,linux系统,apache服务器.在本地以及其他服务器测试完好的程序上传到万网M3主机之后一直提示无法上传文件,经过调试发现是上传文件需要的 $_FILES变量一直为空了,所以无法上传图片. 解决办法: 经过在M3控制面板不断寻找,发现了php.ini设置页面: 默认的上传文件开关控制是关闭的,选择打开->提交->等待5分钟.上传成功... 顺便提一下,这个M3主机竟然还不支持pathinfo. 其他swf

三个思路解决laravel上传文件报错:413 Request Entity Too Large问题

最近一个项目当中,要求上传图片,并且限制图片大小,虽然在laravel当中已经添加了相关的表单验证来阻止文件过大的上传,然而当提交表单时,还没轮到laravel处理,nginx就先报错了.当你仔细看报错页面时,你会发现有nginx版本信息,经过分析,这报错是因为nginx的默认上传文件大小配置client_max_body_size只有2MB, 基于nginx验证比laravel验证要早,想要友好报错而不是直接显示413 Request Entity Too Large,那么就有三个思路去解决.

Win 2003上传文件不能超过200k解决方法

解决|上传 问题:无法上传较大的文件"Request 对象 错误 'ASP 0104 : 80004005'"或者上传成功后,找不到文件名 更改Win 2003的IIS 6.0对asp的上传文件大小为200k限制,aspx的上传程序没有影响.在IIS6.0中,默认设置是特别严格和安全的,最大只能传送 204,800 个字节,这样可以最大限度地减少因以前太宽松的超时和限制而造成的攻击.IIS 6 出于安全考虑, 默认最大请求是200K(也即最大提交数据限额为200KByte,204800

ASP跨服务器上传文件完美解决

服务器|解决|上传 如果你有两个空间,一个大而慢,另外一个小而快,或者其中一个不支持FSO,那么跨服务器上传文件这个问题就摆在你面前了,下面就是我在解决ylog.net里面的跨服务器上传文件的日记,这个问题看似简单,里面的细节问题却是非常有趣 前提条件,空间都必须支持ASP,上传文件的服务器支持FSO,下面的叙述中,diygame.com为存上传文件的服务器,ylog.net为网站服务器,即显示用户界面的服务器... 实现功能,文件上传,上传后在网页的文本区域自动加上对于图片的UBB码,为了清楚