消息关闭
    暂无新消息!
文件名在网页可以正常显示,但是保存的文件 文件名中的中文全都是问号,主机的系统是centos6.5
访问地址是 http://119.29.161.142/FileUpload/upload.jsp    新手一个,希望大家能够帮帮我,谢谢



上传处理的Servlet

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
 

/**
 * Servlet implementation class UploadServlet
 */
@WebServlet("/UploadServlet")
public class UploadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
     
    // 上传文件存储目录
    private static final String UPLOAD_DIRECTORY = "upload";
 
    // 上传配置
    private static final int MEMORY_THRESHOLD   = 1024 * 1024 * 3;  // 3MB
    private static final int MAX_FILE_SIZE      = 1024 * 1024 * 40; // 40MB
    private static final int MAX_REQUEST_SIZE   = 1024 * 1024 * 50; // 50MB
 
    /**
     * 上传数据及保存文件
     */
    protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// 检测是否为多媒体上传
if (!ServletFileUpload.isMultipartContent(request)) {
    // 如果不是则停止
    PrintWriter writer = response.getWriter();
    writer.println("Error: 表单必须包含 enctype=multipart/form-data");
    writer.flush();
    return;
}
 
        // 配置上传参数
        DiskFileItemFactory factory = new DiskFileItemFactory();
        // 设置内存临界值 - 超过后将产生临时文件并存储于临时目录中
        factory.setSizeThreshold(MEMORY_THRESHOLD);
        // 设置临时存储目录
        factory.setRepository(new File(System.getProperty("java.io.tmpdir")));
 
        ServletFileUpload upload = new ServletFileUpload(factory);
         
        // 设置最大文件上传值
        upload.setFileSizeMax(MAX_FILE_SIZE);
         
        // 设置最大请求值 (包含文件和表单数据)
        upload.setSizeMax(MAX_REQUEST_SIZE);
        
        // 中文处理
        upload.setHeaderEncoding("UTF-8"); 

        // 构造临时路径来存储上传的文件
        // 这个路径相对当前应用的目录
        String uploadPath = "/upload";
       
         
        // 如果目录不存在则创建
        File uploadDir = new File(uploadPath);
        if (!uploadDir.exists()) {
            uploadDir.mkdir();
        }
 
        try {
            // 解析请求的内容提取文件数据
            @SuppressWarnings("unchecked")
            List<FileItem> formItems = upload.parseRequest(request);
 
            if (formItems != null && formItems.size() > 0) {
                // 迭代表单数据
                for (FileItem item : formItems) {
                    // 处理不在表单中的字段
                    if (!item.isFormField()) {
                        String fileName = new File(item.getName()).getName();
                        String filePath =  uploadPath + File.separator + fileName;
                        File storeFile = new File(filePath);
                        // 在控制台输出文件的上传路径
                      //  System.out.println(filePath);
                        // 保存文件到硬盘
                        item.write(storeFile);
                        request.setAttribute("message",
                            "文件上传成功! "+ item.getName());
                    }
                }
            }
        } catch (Exception ex) {
            request.setAttribute("message",
                    "错误信息: " + ex.getMessage());
        }
        // 跳转到 message.jsp
        getServletContext().getRequestDispatcher("/message.jsp").forward(
                request, response);
    }
}]



上传页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<link rel="stylesheet" href="css/style.css">
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<title>在线提交</title>
</head>
<body>
<br><br><br><br><br><br><br>
<!-- demo content -->
<div class="loginform cf">
<form method="post" action="/FileUpload/uploadServlet" enctype="multipart/form-data">
请选择一个文件:
<input type="file" name="uploadFile" />
<br/><div><%=request.getAttribute("loginInfo")==null?"":request.getAttribute("loginInfo")%></div>
<br/>
<input type="submit" value="上传" />
</form>
</div>

</body>

</html>

]


9个回答

︿ 2
jsp里面<meta http-equiv="Content-Type" content="text/html; charset=GBK">也改成UTF-8了,还是乱码
︿ 1
我以前也遇到过,分享一下我的解决方式,绝对有效!

@RequestMapping("excel/download")
public String download(ExcelInfo excelInfo, HttpServletRequest request,
HttpServletResponse response) {
    
response.setCharacterEncoding("utf-8");
response.setContentType("multipart/form-data");
response.setHeader("Content-Disposition", "attachment;fileName=" + convertCharacterEncoding(request,excelInfo.getFileName()) + ".xls");
OutputStream os = null;

        try {
            os = response.getOutputStream();
            ExcelUtil.createWorkBook(excelInfo.getDataList(), excelInfo.getKeyMap(), excelInfo.getSheetName()).write(os);
        }catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
return null;
}

public String convertCharacterEncoding(HttpServletRequest request, String fileName) {
     String agent = request.getHeader("USER-AGENT").toLowerCase();
     //根据浏览器类型处理文件名称
     if(agent.indexOf("msie")>-1){
         try {
fileName = java.net.URLEncoder.encode(fileName, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
     }else{
         try {
fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
     }
     return fileName;
}
︿ 1
 String fileName = new File(item.getName()).getName();在这行打断点看看是否拿到的是乱码
︿ 0
或者你可以考虑把中文名字换成当前时间+随机数+后缀名的文件保存起来
︿ 0
如果是文件上传的话你可以试一下:
把你要用的数据换了


public class FileUtils {
/**
 * 上传文件
 * @param request
 * @param response
 * @return
 * @throws ServletException
 * @throws IOException
 */
public String[]  uploadFile(HttpServletRequest request, HttpServletResponse response,String savePath )    throws ServletException, IOException {   
//得到上传文件的保存目录,将上传的文件存放于WEB-INF目录下,不允许外界直接访问,保证上传文件的安全   
     AuthUser user = (AuthUser) SecurityUtils.getSubject().getSession().getAttribute(PrivilegeResource.SESSION_USER);
//     String savePath = "D:/HD_RZG_EAM_5.0/files/upload";
//     String[] a = user.getAccount().split("@");
     String account = "";
     String saveFilename = "";
     FileOutputStream out= null;
String idNo="";
String fileNam="";
String fileUrl="";
String saveNam="";
String fileExtName="";
String[] blob = new String[5]; 
//上传时生成的临时文件保存目录     
String tempPath = request.getSession()
.getServletContext().getRealPath("/WEB-INF/temp");     
File tmpFile = new File(tempPath);     
if (!tmpFile.exists()) {     
//创建临时目录     
tmpFile.mkdir();    
   }          
//消息提示     
//String message = "";     
try{      
//使用Apache文件上传组件处理文件上传步骤:      
//1、创建一个DiskFileItemFactory工厂     
DiskFileItemFactory factory = new DiskFileItemFactory();      
//设置工厂的缓冲区的大小,当上传的文件大小超过缓冲区的大小时,就会生成一个临时文件存放到指定的临时目录当中。   
factory.setSizeThreshold(1024*100);
//设置缓冲区的大小为100KB,如果不指定,那么缓冲区的大小默认是10KB     
//设置上传时生成的临时文件的保存目录    
factory.setRepository(tmpFile);   
//2、创建一个文件上传解析器     
ServletFileUpload upload = new ServletFileUpload(factory);     
//监听文件上传进度      
upload.setProgressListener(new ProgressListener(){     
public void update(long pBytesRead, long pContentLength, int arg2) { 
System.out.println("文件大小为:" + pContentLength + ",当前已处理:" + pBytesRead);       
/**        * 文件大小为:14608,当前已处理:4096         文件大小为:14608,当前已处理:7367         文件大小为:14608,当前已处理:11419         文件大小为:14608,当前已处理:14608        */     
}      });    
//解决上传文件名的中文乱码    
upload.setHeaderEncoding("UTF-8");   
//3、判断提交上来的数据是否是上传表单的数据     
/* if(!ServletFileUpload.isMultipartContent(request)){      
//按照传统方式获取数据   
return;     
}  */         
//设置上传单个文件的大小的最大值,目前是设置为1024*1024字节,也就是1MB      
upload.setFileSizeMax(1024*1024);     
//设置上传文件总量的最大值,最大值=同时上传的多个文件的大小的最大值的和,目前设置为10MB      
upload.setSizeMax(1024*1024*10);     
//4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项  
List<FileItem> list = upload.parseRequest(request);     
for(FileItem item : list){     
//如果fileitem中封装的是普通输入项的数据      
if(item.isFormField()){       
String name = item.getFieldName();   
//解决普通输入项的数据的中文乱码问题       
String value = item.getString("UTF-8");      
                        value = new String(value.getBytes("iso8859-1"),"UTF-8");     
idNo=value;
if(idNo.indexOf("@")>0){
account=idNo.split("@")[0]+".png";
}
}else{
//如果fileitem中封装的是上传文件        //得到上传的文件名称,     
String filename = item.getName();   
fileNam=filename;
if(filename==null || filename.trim().equals("")){  
continue;      
}       
//注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如: c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt        
//处理获取到的上传文件的文件名的路径部分,只保留文件名部分      
filename = filename.substring(filename.lastIndexOf("\\")+1);      
//得到上传文件的扩展名        
fileExtName = filename.substring(filename.lastIndexOf(".")+1);       
//如果需要限制上传的文件类型,那么可以通过文件的扩展名来判断上传的文件类型是否合法      
//获取item中的上传文件的输入流        
InputStream in = item.getInputStream();
//根据传入路径判断用哪个保存名字
// String[] path = savePath.split("/");
// String pathShort=path[3];
//得到文件保存的名
if(account.equals("")){
 saveFilename =HdUtils.generateUUID()+"_"+ filename;
}else{
 saveFilename = account;
}
saveNam = saveFilename;
//得到文件的保存目录        
//upload\2\3 upload\3\5   //File既可以代表文件也可以代表目录 
File file = new File(savePath);  
//如果目录不存在   
if(!file.exists()){   
//创建目录    
file.mkdirs(); 
}   
String path = file.getPath()+file.separator+saveNam;
fileUrl=savePath;
//创建一个文件输出流        
    out = new FileOutputStream(path);      
//创建一个缓冲区        
byte buffer[] = new byte[1024];       
//判断输入流中的数据是否已经读完的标识       
int len = 0;       
//循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据        
while((len=in.read(buffer))!=-1){        
//使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\\" + filename)当中        
out.write(buffer, 0, len);     
}        
//关闭输入流        
in.close();        
//关闭输出流        
out.close();      
//删除处理文件上传时生成的临时文件        //
item.delete();        
//message = "文件上传成功!"; 
                    }
// if(!"".equals(idNo)&&null!=idNo){
//  String sql="insert into DEV_CARD_FILE ( dev_no,seq_no,file_url,file_nam,save_nam,record_nam,record_tim,update_nam,update_tim)"
//   + " values('"+idNo+"','"+HdUtils.generateUUID()+"','"+fileUrl+"','"+fileNam+"','"+saveNam+"','"+user.getName()+"',sysdate,'"+user.getName()+"',sysdate)";
//  executeNativeSql(sql, null);
// }
  }
blob[0]=idNo;
blob[1]=fileNam;
blob[2]=saveNam;
blob[3]=fileUrl;
blob[4]=fileExtName;
}catch (FileUploadBase.FileSizeLimitExceededException e) {     
e.printStackTrace(); 
//request.setAttribute("message", "单个文件超出最大值!!!");    
}
            catch (FileUploadBase.SizeLimitExceededException e) {  
             e.printStackTrace();  
             //request.setAttribute("message", "上传文件的总的大小超出限制的最大值!!!");      
             //request.getRequestDispatcher("/message.jsp").forward(request, response);    
             }
            catch (Exception e) {     
             idNo= null;    
             e.printStackTrace();    
             }   
              // request.setAttribute("message",message);    
      return blob;
              }

private ServletRequest getServletContext() {
// TODO Auto-generated method stub
return null;
}

private String makeFileName(String filename){ 
//2.jpg   //为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名   
return UUID.randomUUID().toString() + "_" + filename; 
}

private String makePath(String filename,String savePath){   
//得到文件名的hashCode的值,得到的就是filename这个字符串对象在内存中的地址   
// int hashcode = filename.hashCode();  
// int dir1 = hashcode&0xf;
// //0--15  
// int dir2 = (hashcode&0xf0)>>4;
//0-15   //构造新的保存目录  
String dir = savePath ;//+ "/" + filename; 
//upload\2\3 upload\3\5   //File既可以代表文件也可以代表目录 
File file = new File(dir);  
String path = file.getPath()+file.separator+filename;
//如果目录不存在   
if(!file.exists()){   
//创建目录    
file.mkdirs(); 
}   
  return dir;  
 }

public void getUpload(HttpServletRequest request, HttpServletResponse response,String bookUrl,String bookSaveNam)throws ServletException, IOException {
String message="";
//String bookNo=map.get("bookNo").toString();
     String path=bookUrl;
     //String fileName=map.get("bookFileNam").toString();
     //String bookSaveNam=bookSaveNam;
     //fileName = fileName.substring(fileName.lastIndexOf("\\")+1);    
     //fileName= makeFileName(fileName);    
//得到要下载的文件名
//String fileName = request.getParameter("filename");
//23239283-92489-阿凡达.avi
//fileName = new String(fileName.getBytes("iso8859-1"),"UTF-8");
//上传的文件都是保存在/WEB-INF/upload目录下的子目录当中
//String fileSaveRootPath=this.getServletContext().getRealPath("/WEB-INF/upload");
//通过文件名找出文件的所在目录
//String path = findFileSavePathByFileName(fileName,fileSaveRootPath);
//得到要下载的文件
File file = new File(path + "/" + bookSaveNam);
//如果文件不存在
if(!file.exists()){
request.setAttribute("message", "您要下载的资源已被删除!!");
}//处理文件名
response.reset();
response.setContentType("application/x-msdownload");
//设置响应头,控制浏览器下载该文件
response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(bookSaveNam, "UTF-8"));
//读取要下载的文件,保存到文件输入流
FileInputStream in = new FileInputStream(path + "/" + bookSaveNam);
//创建输出流
OutputStream out = response.getOutputStream();
//创建缓冲区
byte buffer[] = new byte[10240000];
int len = 0;
//循环将输入流中的内容读取到缓冲区当中
while((len=in.read(buffer))>0){
//输出缓冲区的内容到浏览器,实现文件下载
out.write(buffer, 0, len);
}//关闭文件输入流
in.close();
//关闭输出流
out.close();
//return message;
}
public String findFileSavePathByFileName(String filename,String saveRootPath){
// int hashcode = filename.hashCode();
// int dir1 = hashcode&0xf; 
// //0--15
// int dir2 = (hashcode&0xf0)>>4; 
//0-15
String dir = saveRootPath + "/" +filename; 
//upload\2\3 upload\3\5
File file = new File(dir);
if(!file.exists()){
//创建目录
file.mkdirs();
}
return dir;
}
/**
 * 删除文件
 * @param bookUrl
 * @param bookSaveNam
 * @return
 * @throws Exception
 */
 public String  delete(String bookUrl,String bookSaveNam) throws Exception {
        String result = "";
        File file = new File(bookUrl + "/" + bookSaveNam);
        if (!file.exists()) {
            return "文件不存在!";
        }
          file.delete();
          result="删除成功!";
          return result;
    }
}