跨服务器上传文件方式

跨服务器上传文件的方式有很多,其中一种是使用在中间服务器上使用临时文件的方式进行保存后再发送到另一个服务器上,实现文件上传。

问题点:中间保存临时文件,还需要不定时的进行文件清理,比较麻烦

直接进行文件的转发,使用byte[]数组方式直接进行文件转发,然后,服务器根据传递的byte[]数组进行转文件方式,使用httpclient方式将byte[]数组发送到服务端,特别注意的点在于,

发送的时候使用"content-type" = "application/json"发送到服务端,服务端使用@RequestBody byte[] bytes 进行方法接收,其他的一些参数如果还要传递,可以使用header将参数传递过去

package com.rainy.demo.utils;import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.ByteArrayRequestEntity;
import org.apache.commons.httpclient.methods.PostMethod;

import java.io.IOException;

/**
 * Created by rainy on 2016/12/17.
 */
public class UpImgUtils {

    public static String getPath(String url, String fileType, byte[] bytes) {
        String path = "";
        try {
            PostMethod method = new PostMethod(url);
            method.setRequestHeader("Content-type" , "application/json");
            method.setRequestHeader("fileType", fileType);
            HttpClient httpClient = new HttpClient();
            method.setRequestEntity(new ByteArrayRequestEntity(bytes));
            int HttpCode = httpClient.executeMethod(method);
            if (HttpCode != HttpStatus.SC_OK) {
                throw new IOException("Invalid HttpStatus: " + HttpCode);
            }
            path = method.getResponseBodyAsString();
        } catch (IOException e) {
            System.err.println(e.getMessage());
        }
        return path;
    }
}

通常,SpringMVC 中使用 MultipartFile 进行文件上传,通过这样的方法获取到上传过来文件的byte[]数组

@RequestMapping("/upload")
@ResponseBody
public String uploadFile(HttpServletRequest request){
    MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
    MultipartFile file = multipartRequest.getFile("file");
    byte[] bytes = null;
    try {
        bytes = file.getBytes();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

服务器端使用,使用该方法来获取对应的上传文件byte[]数组

public String upLoad(@RequestBody byte[] inputData, HttpServletRequest request) {

}

网友使用的byte[]数组转文件的方式,没有试过,不过这个不是重点,重点在于中间转发点,只要能拿到byte[]数组,转文件还是比较容易的

public class T3 {  

    public static void main(String[] args){
        String filePath = "E:\\softoon\\workspace_softoon\\TestMobile\\src\\1.docx";
        String outFilePath = "E:\\softoon\\workspace_softoon\\TestMobile\\src";
        String outFileName = "2.docx";  

        getFile(getBytes(filePath),outFilePath,outFileName);
    }  

    /**
     * 获得指定文件的byte数组
     */
    public static byte[] getBytes(String filePath){
        byte[] buffer = null;
        try {
            File file = new File(filePath);
            FileInputStream fis = new FileInputStream(file);
            ByteArrayOutputStream bos = new ByteArrayOutputStream(1000);
            byte[] b = new byte[1000];
            int n;
            while ((n = fis.read(b)) != -1) {
                bos.write(b, 0, n);
            }
            fis.close();
            bos.close();
            buffer = bos.toByteArray();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return buffer;
    }  

    /**
     * 根据byte数组,生成文件
     */
    public static void getFile(byte[] bfile, String filePath,String fileName) {
        BufferedOutputStream bos = null;
        FileOutputStream fos = null;
        File file = null;
        try {
            File dir = new File(filePath);
            if(!dir.exists()&&dir.isDirectory()){//判断文件目录是否存在
                dir.mkdirs();
            }
            file = new File(filePath+"\\"+fileName);
            fos = new FileOutputStream(file);
            bos = new BufferedOutputStream(fos);
            bos.write(bfile);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (bos != null) {
                try {
                    bos.close();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }
        }
    }
}

整体的使用方式已经写出来了,用在什么地方还需要讨论,不过,这样的实现方式还是很不错的,减少了临时文件的存放,而且,代码量减少很多。

时间: 2024-08-04 23:58:17

跨服务器上传文件方式的相关文章

idea 内置tomcat jersey 跨服务器 上传文件报400错误

报错内容 com.sun.jersey.api.client.UniformInterfaceException: PUT http://.jpg returned a response status of 400 Bad Request 因为跨服务器上传文件,文件名中里面含有中文名称,所以报错,解决: 让文件服务器支持utf-8编码或者将文件名变成英文.(最好的就是根据时间加随机数 或者是UUID来命名) 简单版的jsersey上传 @RequestMapping("/fileupload3&

ASP.NET跨服务器上传文件的相关解决方案

第一种:通过FTP来上传文件 首先,在另外一台服务器上设置好FTP服务,并创建好允许上传的用户和密码,然后,在ASP.NET里就可以直接将文件上传到这台 FTP 服务器上了.代码如下: <%@ Page Language="C#" EnableViewState="false"%> <%@ Import Namespace="System.Net" %><%@ Import Namespace="Syste

关于nutz跨服务器上传文件

发布于 578天前  作者 yong9664  770 次浏览  复制  上一个帖子  下一个帖子 标签: 无 是这样的,项目在一台服务器,文件要存储到另外一台服务器.项目中功能使用form表单上传 @At @AdaptBy(type = UploadAdaptor.class, args = { "${app.root}/WEB-INF/tmp" }) public String add(@Param("upload_file")TempFile f, HttpS

七牛跨服务器上传文件带参数

HttpPostedFileBase file = Request.Files["file"]; //System.IO.Stream s = file.InputStream; byte[] buffer = new byte[1024]; //int bytesRead = 0; //while ((bytesRead = file.InputStream.Read(buffer, 0, buffer.Length)) != 0) //{ //} buffer=StreamToBy

springmvc中Tomcat跨服务器上传中文名文件报错解决方案

今天花了一整天时间解决tomcat跨服务器上传文件失败的问题,经过各种搜索终于解决了,下面是解决具体方法: 一.首先修改Tomcat的只读属性为false. 在tomcat的conf目录下的web.xml文件中找到<servlet>标签,添加初始化参数readonly,代码如下: <servlet> <servlet-name>default</servlet-name> <servlet-class>org.apache.catalina.se

Js 跨域上传文件

代码在github上( https://github.com/andygithubchen/jsUpload ),请结合github上的文件阅读. 主要实现js跨域上传文件,这里的跨域目前只在两个域名所指向的服务器在同一局域网内. 当然,这两种方案都可以做同域名上传. 例如: 192.168.1.60 www.test.cn 192.168.1.61 www.video.cn 如果要在www.test.com域名下上传文件到www.video.com域名下,可以使用下面这两个方案: 方案一(在s

WPF中利用WebClient向服务器上传文件

转载:原文地址http://blog.csdn.net/wj1589300/article/details/9255631 WPF中利用WebClient向服务器上传文件 忽然接到一个任务,在WPF中上传文件至服务器~在网上搜了很多种方法,最终决定利用WebCient实现文件的上传工作,看似很简单的任务,却遇到了很多问题.先说一下我的探索步骤吧~ 一.选用WebClient.UploadFile方法 (String,String, String) [csharp] view plaincopyp

web服务器上传文件过程

通过web服务器上传文件,需要提前准备好下面3步,然后才能通过第4步上传文件1.web服务器的配置 1.1 将代码src目录中的select.c文件的170行的REQUEST_TIMEOUT改为10*REQUEST_TIMEOUT 1.2 在buildroot中选中boa后保存编译,然后更新nfs_root中内容: 1.3 重启单板 1.4 配置/etc/boa/boa.conf文件 1.4.1 屏蔽掉Group nobody,增加Group 0 1.4.2 去掉Errorlog前的屏蔽 1.4

模拟php curl向远程服务器上传文件

test.php: <?php header('content-type:text/html;charset=utf8'); $ch = curl_init(); //加@符号curl就会把它当成是文件上传处理 $data = array('img'=>'@'. dirname(__FILE__).'/img/1.jpg'); curl_setopt($ch,CURLOPT_URL,"http://localhost:8088/curl/get_img.php"); cur