【发布时间】:2012-07-26 15:04:03
【问题描述】:
当我使用 nginx 上传进度模块上传文件时,文件开始正常上传,然后我得到了上传多少的进度,但是当文件上传完成时我得到错误 (({ "state" : "error", "status" : 17523466568084 });)
好吧,我的疯狂猜测是,在我的配置中指定了后端 upload_pass /upload;,我没有,并且每次它最后上传文件时它都会尝试获取这个后端并给我错误,因为它没有存在。我试图注释掉这一行,但后来我从 nginx 得到另一个错误( "track_uploads" 指令 track_upload 应该是该位置的最后一个指令,在 /etc/nginx/sites-enabled/web 中的 proxy_pass 或 fastcgi_pass 之后-files.com:52)。
1)所以第一个问题是什么错误?
2)第二个是我如何在后端获取那些从 nginx 传递到后端的参数。
也许有人有什么想法。
我的 nginx 配置文件:
http {
...
upload_progress upload 2m;
server {
listen 80;
server_name mydomain;
root /home/cha0s/web-files;
index index.php;
location ~ \.php$ {
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME /home/cha0s/web-files$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_script_name;
}
location ~ ^/files/(.*)$ {
alias /home/cha0s/$1;
internal;
}
location = /upload/share {
client_max_body_size 250m;
#Specify backend location/url and directory for file upload
upload_pass /upload;
upload_store /tmp;
# Declare variables which are passed to backend
upload_set_form_field $upload_field_name.name "$upload_file_name";
upload_set_form_field $upload_field_name.content_type "$upload_content_type";
upload_set_form_field $upload_field_name.path "$upload_tmp_path";
upload_aggregate_form_field "$upload_field_name.md5" "$upload_file_md5";
upload_aggregate_form_field "$upload_field_name.size" "$upload_file_size";
# Delete uploaded file on error
upload_cleanup 400 404 499 500-505;
# Limit upload speed
upload_limit_rate 8k;
track_uploads upload 1m;
}
location = /upload/status {
report_uploads upload;
}
}
}
我的test.php:
<!doctype html>
<html lang="ru">
<head>
<meta charset="utf-8">
<script>
function add() {
if (parseInt(document.getElementById('count').getAttribute('value')) < 8) {
var input = document.createElement('input');
input.setAttribute('type','file');
input.setAttribute('multiple','');
input.setAttribute('name','file[]');
document.getElementById('multiple').appendChild(input);
document.getElementById('multiple').appendChild(document.createElement('br'));
document.getElementById('count').setAttribute('value',parseInt(document.getElementById('count').getAttribute('value'))+1);
}
else {
alert('Можно загрузить не более 8 файлов за раз.');
}
}
function progress() {
var ms = new Date().getTime() / 1000;
rq = 0;
id = "";
for (i = 0; i < 32; i++) {
id += Math.floor(Math.random() * 16).toString(16);
}
document.getElementById('upload').action = "/upload/share?X-Progress-ID=" + id;
document.getElementById('status').style.display = 'block'
interval = window.setInterval(function () { fetch(id, ms); }, 1000);
return true;
}
function fetch(id, ms) {
var fetch = new XMLHttpRequest();
fetch.open("GET", "/upload/status", 1);
fetch.setRequestHeader("X-Progress-ID", id);
fetch.onreadystatechange = function () {
if (fetch.readyState == 4) {
if (fetch.status == 200) {
var now = new Date().getTime() / 1000;
var upload = eval(fetch.responseText);
if (upload.state == 'uploading') {
var diff = upload.size - upload.received;
var rate = upload.received / upload.size;
var elapsed = now - ms;
var speed = upload.received - rq; rq = upload.received;
var remaining = (upload.size - upload.received) / speed;
var uReceived = parseInt(upload.received) + ' bytes';
var uDiff = parseInt(diff) + ' bytes';
var tTotal = parseInt(elapsed + remaining) + ' secs';
var tElapsed = parseInt(elapsed) + ' secs';
var tRemaining = parseInt(remaining) + ' secs';
var percent = Math.round(100*rate) + '%';
var uSpeed = speed + ' bytes/sec';
document.getElementById('length').firstChild.nodeValue = parseInt(upload.size) + ' bytes';
document.getElementById('sent').firstChild.nodeValue = uReceived;
document.getElementById('offset').firstChild.nodeValue = uDiff;
document.getElementById('total').firstChild.nodeValue = tTotal;
document.getElementById('elapsed').firstChild.nodeValue = tElapsed;
document.getElementById('remaining').firstChild.nodeValue = tRemaining;
document.getElementById('speed').firstChild.nodeValue = uSpeed;
document.getElementById('bar').firstChild.nodeValue = percent;
document.getElementById('bar').style.width = percent
}
else {
window.clearTimeout(interval);
}
}
}
}
fetch.send(null);
}
</script>
</head>
<body>
<form method="post" enctype="multipart/form-data" id="upload" onsubmit="progress();">
<input type="hidden" id="count" value="1" />
<div id="multiple">
<input type="file" name="file[]" multiple /><br>
</div>
<input type="submit">
<a href="#" onclick="add();">add();</a>
</form>
<div id="status" style="display: none;">
<table width="100%">
<tr><th></th><th>загрузка</th><th>осталось</th><th>всего</th></tr>
<tr><td>время:</td><td id="elapsed">∞</td><td id="remaining">∞</td><td id="total">∞</td></tr>
<tr><td>размер:</td><td id="sent">0 b</td><td id="offset">0 b</td><td id="length">0 b</td></tr>
<tr><td>скорость:</td><td id="speed">n/a</td></tr>
</table>
<div style="border: 1px solid #c0c0c0;">
<div style="background: #c0c0c0; width: 0%; text-align: right;" id="bar">0%</div>
</div>
<a href="#" onclick="if (confirm('Вы точно хотите отменить загрузку?')) window.location = '/'" id="cancel">cancel_upload();</a>
</div>
</body>
</html>
【问题讨论】:
-
好的。经过一些测试,我确信问题与代理通过有关....唯一我不明白这应该指向哪里。基本上upload_pass /upload 应该是正确的,但是由于它不存在它失败.....所以回到第一方,/upload 应该存在什么??????因为如果删除行 upload_pass /upload 并放置一些随机 proxy_pass 127.0.0.1 并尝试上传文件,它要么给我错误 500 ,要么只是告诉我该文件不存在 ....
-
您应该指定一个后端来处理上传的文件并返回响应。
-
没有后台我该怎么做......我应该为proxy_pass指定什么......也许你可以写一个简单的后端......并展示它的外观?如果理解正确,这个后端应该可以在 url mydomain.com/upload 获得?
-
这是可选的。它可能在 url 上不可用。上传模块仓库中有一个例子:github.com/vkholodkov/nginx-upload-module/blob/master/…
-
这是我的一个应用程序的示例:pastebin.com/YFyjnDn4 (Python)
标签: file-upload nginx