在阿里云云存储OSS中下载文件时设置文件名的办法:
import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.net.URLEncoder; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import com.aliyun.openservices.oss.OSSClient; import com.aliyun.openservices.oss.model.GeneratePresignedUrlRequest; import com.aliyun.openservices.oss.model.ObjectMetadata; import com.aliyun.openservices.oss.model.PutObjectResult; import com.aliyun.openservices.oss.model.ResponseHeaderOverrides; public class Sample { public static void main(String[] args) throws IOException, ParseException { //http://aliyun_portal_storage.oss.aliyuncs.com/oss_api/oss_javahtml/index.html //OSS的用户名与密码 String accessKeyId = "w5c4HJfSXoegx74M"; String accessKeySecret = "**************"; String endpoint = "http://oss-cn-qingdao.aliyuncs.com"; OSSClient client = new OSSClient(endpoint, accessKeyId, accessKeySecret); //http://bbs.aliyun.com/read/149100.html String bucketName="resource-ds"; //判断一下Bucket是不是存在 /* if(!client.doesBucketExist(bucketName)) { // 新建一个Bucket //由于Bucket的名字是全局唯一的,所以尽量保证你的 bucketName 不与别人重复。 client.createBucket(bucketName); client.setBucketAcl(bucketName, CannedAccessControlList.Private); System.out.println("创建Bucket成功完成!"); } */ //删除Bucket //client.deleteBucket(bucketName); //System.out.println("删除Bucket成功完成!"); //上传一个文件 String filePath="F:\\Download\\20140418120446935.png"; // 获取指定文件的输入流 File file = new File(filePath); InputStream content = new FileInputStream(file); // 创建上传Object的Metadata ObjectMetadata meta = new ObjectMetadata(); // 必须设置ContentLength meta.setContentLength(file.length()); String key="test/"+new File(filePath).getName(); // 上传Object. PutObjectResult result = client.putObject(bucketName, key, content, meta); // 打印ETag System.out.println("上传文件的MD5值"+result.getETag()); //显示中文名称的 //Date expires = new Date (new Date().getTime() + 1000000000 * 60*60); // 10 minute to expire SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); Date expires = format.parse("2080-01-01 00:00:00"); GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName, key); generatePresignedUrlRequest.setExpiration(expires); ResponseHeaderOverrides responseHeaders=new ResponseHeaderOverrides(); //不同浏览器上中文文件名的下载乱码问题 //http://java-xp.iteye.com/blog/903048 String filename="黄海测试.png"; //For IE String new_filename = URLEncoder.encode(filename, "UTF8"); responseHeaders.setContentDisposition("attachment;filename="+new_filename); generatePresignedUrlRequest.setResponseHeaders(responseHeaders); URL url = client.generatePresignedUrl(generatePresignedUrlRequest); System.out.println(url.toString().Replace("+","%2B")); //For FireFox And Chrome new_filename = filename; responseHeaders.setContentDisposition("attachment;filename="+new_filename); generatePresignedUrlRequest.setResponseHeaders(responseHeaders); url = client.generatePresignedUrl(generatePresignedUrlRequest); System.out.println(url.toString().Replace("+","%2B")); /* // 获取指定bucket下的所有Object信息 ObjectListing listing = client.listObjects(bucketName); // 遍历所有Object for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) { System.out.println(objectSummary.getKey()); } //下载 OSSObject mydown=client.getObject(bucketName, key); InputStream is =mydown.getObjectContent(); // 1K的数据缓冲 byte[] bs = new byte[1024]; // 读取到的数据长度 int len; // 输出的文件流 String savePath="c:\\1.doc"; OutputStream os = new FileOutputStream(savePath); // 开始读取 while ((len = is .read(bs)) != -1) { os.write(bs, 0, len); } // 完毕,关闭所有链接 os.close(); is .close(); */ } }
在nginx中配置中文文件名称,在各种浏览器和迅雷中都能正确下载中文文件名的办法:
#user nobody;
worker_processes 4;
worker_rlimit_nofile 100000;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
use epoll;
multi_accept on;
worker_connections 2048;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
client_header_buffer_size 128k;
client_body_buffer_size 512k;
large_client_header_buffers 4 128k;
#keepalive_timeout 0;
keepalive_timeout 65;
gzip on;
gzip_min_length 1k;
gzip_buffers 16 64k;
gzip_http_version 1.1;
gzip_comp_level 6;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
upstream backend {
server 127.0.0.1:8080;
}
#加载lua的初始化文件
init_by_lua_file /usr/local/lua_script/init.lua;
server {
listen 80;
server_name localhost;
charset utf-8;
#access_log logs/host.access.log main;
location / {
#root html;
#index index.html index.htm;
root /usr/local/tomcat7/webapps/;
proxy_pass http://backend;
}
location /down/ {
if ($arg_flag = "download")
{
#参考:http://ju.outofmemory.cn/entry/71360
add_header Content-Encoding "utf-8";
add_header Content-Type "x-msdownload";
add_header Cache-Control "private";
add_header Accept-Rangles "bytes";
add_header Content-Disposition "attachment;filename=$arg_n;filename*=UTF-8''$arg_n;";
add_header Pragma "no-cache";
add_header Expires "0";
}
alias /usr/local/openresty/nginx/html/down/;
}
#配置Nginx动静分离,定义的静态页面直接从Nginx发布目录读取。
location ~* ^/(?![down])\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)
{
root /usr/local/tomcat7/webapps;
#expires定义用户浏览器缓存的时间为3天,如果静态页面不常更新,可以设置更长,这样可以节省带宽和缓解服务器的压力
expires 3d;
}
location /dsideal_yy/login/doLogin {
content_by_lua_file /usr/local/lua_script/login.lua;
}
location /dsideal_yy/resource/getStageSubject {
content_by_lua_file /usr/local/lua_script/xd_subject.lua;
}
location /dsideal_yy/resource/getAllScheme {
content_by_lua_file /usr/local/lua_script/version.lua;
}
location /dsideal_yy/resource/getResourceList {
content_by_lua_file /usr/local/lua_script/resource_list.lua;
}
location /dsideal_yy/resource/getResourceMyList {
content_by_lua_file /usr/local/lua_script/resource_my_list.lua;
}
location /utf_code {
content_by_lua_file /usr/local/lua_script/utf_code.lua;
}
location /dsideal_yy/resource/setDownCount {
content_by_lua_file /usr/local/lua_script/down_count.lua;
}
location /dsideal_yy/resource/getStructureInfo {
content_by_lua_file /usr/local/lua_script/structure.lua;
}
location /dsideal_yy/resource/getPersonXdkm {
content_by_lua_file /usr/local/lua_script/person_xdkm_get.lua;
}
location /dsideal_yy/resource/savePerosnXdkm {
content_by_lua_file /usr/local/lua_script/person_xdkm_set.lua;
}
location /dsideal_yy/resource/getMediaTypeByXdkm {
content_by_lua_file /usr/local/lua_script/media_type.lua;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}