SSH+CKeditor下使用HttpClient实现文件的上传

简直*了狗了,老师需要我实现上传图片到远程文件服务器,说是为了负载均衡,资源同步,数据安全……balabala,理由能说出一大箩筐……

身为尊老爱幼的四好青年,毕竟老师带我那么久了,他说啥就是啥……所以干……

1、过程

各种问度娘,看博客,逛论坛……HttpClient 、HttpURLConnection、FTP、SFTP...好吧各种网络传输协议都试过一遍,发现自己还是回到原点……

自己智障的原因,懒……只想着把网上的代码复制下来,直接用,却没有好好的分析……

2、迷茫

忙活了一个星期,老师一直催,但一直没什么进展,一直想有个老司机带我飞多好,不过越这样想,越对自己都没信心了,痛定思痛……

3、希望

好吧,不能指望老司机了,还是得靠自己。使用谷歌,上github,认真查阅文档……和妹子聊天,妹子鼓励我,又重新对自己有了信心……

慢慢的自己有了头绪,正如《美队3》里面的反派所说,"只要有经验和耐心,任何事都可以做到……"

最后选择Http协议的理由:HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。

虽然在 JDK 的 java.net 包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。HttpClient 用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。

4、代码

本地服务器192:CkeditorUploadAction

PostMethod filePost = new PostMethod(URL_STR);
      HttpClient client = new HttpClient();
      String dirName = getUserInfo().getUsername();
      try {
          // 通过以下方法可以模拟页面参数提交
          Part[] parts = { new FilePart(dirName+'-'+trueName, toFile) };
          filePost.setRequestEntity(new MultipartRequestEntity(parts, filePost.getParams()));

          client.getHttpConnectionManager().getParams().setConnectionTimeout(5000);

          int status = client.executeMethod(filePost);
          if (status == HttpStatus.SC_OK) {
              System.out.println("上传成功");
          } else {
              System.out.println("上传失败");
          }
      } catch (Exception ex) {
          ex.printStackTrace();
      } finally {
          filePost.releaseConnection();
      }

远程服务器192:UploadFileServlet

package com.servlet;

import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Iterator;
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.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

/**
 * Servlet implementation class UploadFileServlet
 */
@WebServlet("/UploadFileServlet")
public class UploadFileServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public UploadFileServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.getWriter().append("Served at: ").append(request.getContextPath());
		try {
			processUpload(request,response);
		} catch (FileUploadException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

//	String uploadPath= "C:\\test\\";
	private static String uploadPath = "C:\\apache-tomcat-8.0.28-windows-x64\\webapps\\uploads\\";
	public void processUpload(HttpServletRequest request, HttpServletResponse response) throws FileUploadException{
        File uploadFile = new File(uploadPath);
        if (!uploadFile.exists()) {
            uploadFile.mkdirs();
        }

        System.out.println("Come on, baby .......");

        try {
			request.setCharacterEncoding("utf-8");
		} catch (UnsupportedEncodingException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
        response.setCharacterEncoding("utf-8");  

        //检测是不是存在上传文件
        boolean isMultipart = ServletFileUpload.isMultipartContent(request);  

        if(isMultipart){
            DiskFileItemFactory factory = new DiskFileItemFactory();  

            //指定在内存中缓存数据大小,单位为byte,这里设为1Mb
            factory.setSizeThreshold(1024*1024);  

            //设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录
            factory.setRepository(new File("C:\\temp"));  

            // Create a new file upload handler
            ServletFileUpload upload = new ServletFileUpload(factory);  

            // 指定单个上传文件的最大尺寸,单位:字节,这里设为50Mb
            upload.setFileSizeMax(50 * 1024 * 1024);    

            //指定一次上传多个文件的总尺寸,单位:字节,这里设为50Mb
            upload.setSizeMax(50 * 1024 * 1024);
            upload.setHeaderEncoding("UTF-8");

            List<FileItem> items  = upload.parseRequest(request);  

            if(items!=null){
                //解析表单项目
                Iterator<FileItem> iter = items.iterator();
                while (iter.hasNext()) {
                    FileItem item = iter.next();
                    System.out.println("item...."+item);
                    System.out.println("item.getFileName()..."+item.getFieldName());
                    //如果是普通表单属性
                    if (item.isFormField()) {
                        //相当于input的name属性   <input type="text" name="content">
                        String name = item.getFieldName();
                        //input的value属性
                        String value = item.getString();

                        System.out.println("属性:" + name + " 属性值:" + value);
                    }
                    //如果是上传文件
                    else {
                        //属性名
                        String fieldName = item.getFieldName();
                        String[] strarray=fieldName.split("-");
                        String newUploadPath =uploadPath+strarray[0];
                        File dirName = new File(newUploadPath);
                        if (!dirName.exists()) {
                        	dirName.mkdirs();
                        }
                        //上传文件路径
                        String fileName = item.getName();
                        fileName = fileName.substring(fileName.lastIndexOf("/") + 1);// 获得上传文件的文件名  

                        try {
                            item.write(new File(newUploadPath, strarray[1]));
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }  

        response.addHeader("token", "hello");
    }
}

ps:网上很多都没有服务端的代码,太坑了,服务端注意需要两个jar文件,commons-fileupload-1.3.1.jar  以及 commons-io-2.5.jar

最后所需的jar,打包下载:链接:http://download.csdn.net/detail/sage_wang/9515110

原创:SH+CKeditor下使用HttpClient实现文件的上传

时间: 2024-07-30 18:03:28

SSH+CKeditor下使用HttpClient实现文件的上传的相关文章

HttpClient实现文件的上传下载

1 HTTP HTTP 协议可能是现在 Internet 上使用得最多.最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源. 虽然在 JDK 的 java.net 包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活.HttpClient 用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议. 一般的情况下我们都是使用Chrome或者

使用HttpClient实现文件的上传下载

1 HTTP HTTP 协议可能是现在 Internet 上使用得最多.最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源. 虽然在 JDK 的 java.net 包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活.HttpClient 用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议. 一般的情况下我们都是使用Chrome或者

linux下使用rzsz实现文件的上传和下载

新搞的云服务器用SecureCRT不支持上传和下载,没有找到rz命令.记录一下如何安装rz/sz命令的方法. 一.工具说明 在SecureCRT这样的ssh登录软件里, 通过在Linux界面里输入rz/sz命令来上传/下载文件. 对于某些linux版本, rz/sz默认没有安装所以需要手工安装.      sz: 将选定的文件发送(send)到本地机器;      rz:运行该命令会弹出 一个文件选择窗口, 从本地选择文件上传到服务器(receive). 下载安装包lrzsz-0.12.20.t

在Windows下生成的shell文件在上传到Linux上发现无法执行

为了批量生成shell文件,我在Windows下用knime循环生成一批shell文件,在上传到Linux上执行时发现报错: [[email protected] Stock]$ ./f_wdt_outsource_outbound_header.sh -bash: ./f_wdt_outsource_outbound_header.sh: /bin/sh^M: 坏的解释器: 没有那个文件或目录 [[email protected] Stock]$ 在将shell文件内的代码完全复制到一个新建的

ssh整合问题总结--在添加商品模块实现图片(文件)的上传

今天在做毕设(基于SSH的网上商城项目)中碰到了一个文件上传的需求,就是在后台管理员的商品模块中,有一个添加商品,需要将磁盘上的图片上传到tomcat保存图片的指定目录中: 完成这个功能需要两个步,第一是图片上传,第二是保存到数据库,在完成这个功能时候碰到了一些小问题,所以把完整的步骤记录一下: 第一步,在form标签下,添加一个属性,enctype="multipart/form-data",  我刚开始脑袋短路将这个属性写到了type为file的那么input标签下,结果死活提交不

Python 进行 SSH 操作,实现本地与服务器的链接,进行文件的上传和下载

Python 进行 SSH 操作,实现本地与服务器的链接,进行文件的上传和下载 2018年5月26日 19:03 阅读 375 评论 7 我本地和服务器的连接一直使用的是 Xshell 5,而在与服务器进行文件操作的时候使用的是 Xshell 推荐安装的一个工具 Xftp 5,然而,昨天自己想着从服务器下载备份好的的数据库文件到本地的时候发现这个文件传输工具居然过期不能用了,好气啊!于是没办法(机智如我)只好用 Python 来实现 SSH 的连接,顺便从服务器批量下载一些文件,实现自动化. 项

winform下通过webclient使用非流方式上传(post)数据和文件

这两天因为工作的需要,需要做一个winform上传数据到服务器端的程序.当时第一个想法是通过webservice的方式来实现,后来觉得麻 烦,想偷懒就没有用这样的方式,http的post方式变成了第一选择.因为以前用的都是httpwebrequest之类的东西进行post提 交,winform下面还真的是第一次,不过很快就在网上找到了webclient这个类,接下来开始实现功能,话说webclient用起来还真的很简 单,一个头信息的声明,然后是URL,最后是post的数据,就完事了.正在高兴的

android下大文件分割上传

由于android自身的原因,对大文件(如影视频文件)的操作很容易造成OOM,即:Dalvik堆内存溢出,利用文件分割将大文件分割为小文件可以解决问题. 文件分割后分多次请求服务. 1 //文件分割上传 2 public void cutFileUpload(String fileType,String filePath) 3 { 4 try 5 { 6 FileAccessI fileAccessI = new FileAccessI(filePath, 0); 7 Long nStartPo

Myeclipse中文件已经上传到服务器目录下,文件也没有被占用,但是页面中无法读取和使用问题的解决方法

这个问题是由于Myeclipse中文件不同步引起的.在Myeclipse中,工程文件是由Myeclipse自动扫描添加的,如果在外部修改了工程目录中的文件但又关闭了自动刷新功能,则会引起文件不同步.此外,在外部没有修改Myeclipse工程中的文件也有可能引起该问题. 解决方法: 有两种解决方法: 1)手动刷新.即在Myeclipse的工程目录中,右键refresh(或者按下F5). 2)配置Myeclipse的选项: a)Myeclipse启动时,刷新workspace,即勾选:window-