Plupload文件重命名

4

我正在使用Plupload上传到S3;我的问题是,我想更改文件的名称,这样当它们驻留在S3中时,它们将被更改为我想要的格式。我成功地从函数中检索了已上传文件的文件名:

 FilesAdded: function (up, files) {
                    for (var i in files) {
                        files[i].name = files[i].name.split('_').join(' ').trim();
                        alert('Selected files: ' + files[i].name);

                    }

当我在控制台更改文件名后,但是当我查看S3时,该文件名未更改。

我确保unique_names属性为false,并将rename属性设置为true;但没有起作用,请帮忙解决一下?


我有同样的问题。然而,通过我的代码,似乎有些文件被重命名了,但其他文件保留了原来的名称。 - Tim B James
另一个建议在这里:http://stackoverflow.com/questions/6534734/plupload-filename-problem/35477481#35477481 - caglaror
4个回答

3

我曾遇到同样的问题,即使用pluploader上传至S3时希望对文件名进行规范化处理。不幸的是,“Files”参数似乎是只读的,因此对文件名的任何更改都不会在提交的表单中显示出来。

但是,如果我们将“key”参数更改为精确的字符串(规范化的名称),它将导致S3以不同的名称保存它。我们可以创建一个规范化的名称,并在“FileAdded”回调中的multipart_param中使用它作为“key”参数。

....
FilesAdded: function(up, files) {
  console.log("Uploader.FilesAdded ", up, files);

  var file = files[0];

  //Replace unwanted characters with "_"
  var new_name = file.name.replace(/[^a-z0-9\.]+/gi,"_").toLowerCase();

  console.log("Changing file name to ", file.name);

  //Create multipart_params here (or just set the 'key' and 'Filename')
  var multipart_params =  {
    'key': config.key + new_name, // *instead of ${filename}
    'Filename':  config.key + new_name,
    'acl': config.acl,
    'Content-Type': '',
    'AWSAccessKeyId' : config.accessId,
    'policy': config.policy,
    'signature': config.signature
  };

 //
 up.settings.multipart_params = multipart_params;
}
....

2

我有一个要求,在执行将文件上传到S3之前,需要为上传队列中的 所有 文件添加用户可定义的前缀。在我的情况下,上传之前可以随时编辑前缀 - 因此使用 FilesAdded 事件是不可接受的。

对我有效的解决方案是使用 BeforeUpload,它会在每个文件上传之前触发。

 BeforeUpload: function(up, file) {

     //Change the filename          
     file.name = appendUniqueId(file.name);
     file.name = addPrefix(file.name);

     var params = up.settings.multipart_params;
     params.key = file.name;
     params.Filename = file.name;

 }

1

尝试使用unique_names:true和rename:true。这对我有效。


由于某些原因,它对我不起作用...可能是multipart_params中的'Key:${filename}'吗? - ibininja

0
我发现唯一完全可行的解决方案是利用Plupload上传器上的属性 multipart_params
我使用的代码是:
uploader.bind('BeforeUpload', function (up, file) {
    uploader.settings.multipart_params = { 'renamedFileName': 'yourRenamedFileName' };
});

然后,在处理图像时,您可以从发布的信息中请求此信息;

c# 代码

var renamedFileName = context.Request["renamedFileName"].ToString();

对于你的代码,你可以尝试如下:

uploader.bind('BeforeUpload', function (up, file) {
    uploader.settings.multipart_params = { 'renamedFileName': file.name.split('_').join(' ').trim(); };
});

您可以使用此附加信息来重命名服务器上的文件。

谢谢您的回复;不过我正在使用S3,所以我不认为我可以利用这个属性。看起来唯一的方法是在上传后以某种方式更改文件名...再次感谢。 - ibininja
另一个建议在这里:http://stackoverflow.com/questions/6534734/plupload-filename-problem/35477481#35477481 - caglaror
这确实是最好的答案,也可能是正确的方法。使用S3时,您只需使用up.settings.multipart_params.key ='filename'而不是重新定义整个对象即可。由于某种原因,这仅在“BeforeUpload”事件中起作用并提供正确的结果。查看@Collie的示例以获取您特定情况下的解决方案。 - user2341406

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接