冈板日川
冈板日川
  • 发布:2014-10-21 14:23
  • 更新:2019-10-25 10:13
  • 阅读:46180

上传,uploader,服务器端代码怎么写?

分类:HTML5+

http://demo.dcloud.net.cn/helloh5/uploader/upload.php文件是怎么实现上传的,它的具体代码谁有!

2014-10-21 14:23 负责人:无 分享
已邀请:
DCloud_App_Array

DCloud_App_Array

这个代码非常简单,你可以参考下:

<?php  

if ($_SERVER['REQUEST_METHOD'] == 'POST') {  

    $ret=array('strings'=>$_POST,'error'=>'0');  

    $fs=array();  

    foreach ( $_FILES as $name=>$file ) {  

        $fn=$file['name'];  
        $ft=strrpos($fn,'.',0);  
        $fm=substr($fn,0,$ft);  
        $fe=substr($fn,$ft);  
        $fp='files/'.$fn;  
        $fi=1;  
        while( file_exists($fp) ) {  
            $fn=$fm.'['.$fi.']'.$fe;  
            $fp='files/'.$fn;  
            $fi++;  
        }  

        move_uploaded_file($file['tmp_name'],$fp);  

        $fs[$name]=array('name'=>$fn,'url'=>$fp,'type'=>$file['type'],'size'=>$file['size']);  
    }  

    $ret['files']=$fs;  

    echo json_encode($ret);  
}else{  
    echo "{'error':'Unsupport GET request!'}";  
}  

?>
  • 冈板日川 (作者)

    .net怎么实现

    2014-10-21 15:32

  • DCloud_heavensoft

    其实你用input type=file上传时,服务器怎么接收就怎么接收。你可以查下type=file时.net如何接收。

    2014-10-22 03:22

  • 山川同学

    回复 DCloud_heavensoft:相同的上传代码,调用同一个nodejs服务端。为什么ios可以上传成功,安卓不行,提示连接中断。求指教

    2015-04-10 16:21

  • 飞龙在天应中网

    这个代码能运行么?谁试过了?我运行不了

    2015-07-02 18:43

  • hihay

    这代码写的。。。。

    2016-01-22 11:24

  • 盗版

    我想把图片压缩后再上传怎么改此代码?

    2016-12-28 15:05

  • 小资电脑

    这段脚本对中文支持不友好

    2018-06-27 22:55

  • 此去经年

    有没有nodejs的后台

    2019-10-25 10:13

飞上青天

飞上青天

给你们贡献一个.net后台的上传

   public IHttpActionResult Post()  
        {  
            if (!Request.Content.IsMimeMultipartContent())  //如果不是文件类型 直接返回  
            {  
                return Ok();  
            }  
            var provider = new MultipartFormDataMemoryStreamProvider();    //文件流  

            try  
            {  
                var result =  Task.Run(async () => await Request.Content.ReadAsMultipartAsync(provider)).Result;  

                string serviceCode = result.FormData.GetValues("serviceCode").FirstOrDefault();  
                string userId = result.FormData.GetValues("userId").FirstOrDefault();  
                string feedback = result.FormData.GetValues("feedback").FirstOrDefault();  

                foreach (var stream in result.Contents.Where((content, idx) => result.IsStream(idx))) {  
                    var filename = stream.Headers.ContentDisposition.FileName.Replace("\"", "");  
                    var ms = stream.ReadAsStreamAsync().Result;  
                    var fileStorage = FileStorageFactory.CreateFileStorage(ms, filename, stream.Headers.ContentType.MediaType);  
                    package.FileStorages.Add(fileStorage);  
                }  

            }  
            catch (Exception e)  
            {  
                return BadRequest();  
            }  
            return Ok("success");  
        }
    public class MultipartFormDataMemoryStreamProvider : MultipartMemoryStreamProvider {  
        private readonly Collection<bool> _isFormData = new Collection<bool>();  
        private readonly NameValueCollection _formData = new NameValueCollection(StringComparer.OrdinalIgnoreCase);  

        public NameValueCollection FormData {  
            get { return _formData; }  
        }  

        public override Stream GetStream(HttpContent parent, HttpContentHeaders headers) {  
            if (parent == null) throw new ArgumentNullException("parent");  
            if (headers == null) throw new ArgumentNullException("headers");  

            var contentDisposition = headers.ContentDisposition;  

            if (contentDisposition != null) {  
                _isFormData.Add(String.IsNullOrEmpty(contentDisposition.FileName));  
                return base.GetStream(parent, headers);  
            }  

            throw new InvalidOperationException("Did not find required 'Content-Disposition' header field in MIME multipart body part.");  
        }  

        public override async Task ExecutePostProcessingAsync() {  
            for (var index = 0; index < Contents.Count; index++) {  
                if (IsStream(index))  
                    continue;  

                var formContent = Contents[index];  
                var contentDisposition = formContent.Headers.ContentDisposition;  
                var formFieldName = UnquoteToken(contentDisposition.Name) ?? string.Empty;  
                var formFieldValue = await formContent.ReadAsStringAsync();  
                FormData.Add(formFieldName, formFieldValue);  
            }  
        }  

        private static string UnquoteToken(string token) {  
            if (string.IsNullOrWhiteSpace(token))  
                return token;  

            if (token.StartsWith("\"", StringComparison.Ordinal) && token.EndsWith("\"", StringComparison.Ordinal) && token.Length > 1)  
                return token.Substring(1, token.Length - 2);  

            return token;  
        }  

        public bool IsStream(int idx) {  
            return !_isFormData[idx];  
        }  
    }  
  • 半杯可乐

    后台的我也用的一般处理程序,但是不知道如何将前台的文件传给后台。看了官方的upload,但是没有成功。

    2015-01-14 12:11

  • 飞上青天

    1449320089 加我qq

    2015-01-14 14:43

  • 半杯可乐

    加了QQ 没有反应。

    2015-01-14 16:14

fer2005

fer2005

折腾了一晚上,终于搞定了Java版本的,具体如下:
使用了Spring的框架+Apache的FileUpload,目前实现的版本为不支持断点续传。根据本人的经验,有几点需要注意:
1调试的时候使用debug的话会出现异常,导致文件接收不正常,如果需要调试的话,用sysout输出结果查看。
2前台使用addData传输的数据只能用字符串,貌似不支持数值型和其他类型的,否则使用request.getParameter()获取不到数据。
具体代码如下:

Map<String, Object> map = new HashMap<String, Object>();  
        if(request.getHeader("content-type")!=null&&"application/x-www-form-urlencoded".equals(request.getHeader("content-type"))){  
            return null;//不支持断点续传,直接返回null即可  
        }  
//将请求转换成  
        MultipartHttpServletRequest mRequest=(MultipartHttpServletRequest)request;  
        Enumeration<String> ps = mRequest.getParameterNames();  
        while(ps.hasMoreElements()){  
            String hname = ps.nextElement();  
            System.out.println(hname);  
            System.out.println(mRequest.getParameter(hname));  
        }  
        int eventType=0;  
        int reportSource=0;  
        double  longitude=0;  
        double latitude=0;  
        if(mRequest.getParameter("eventType")!=null||!"".equals(mRequest.getParameter("eventType").trim()))  
            eventType= Integer.parseInt(mRequest.getParameter("eventType"));  
        if(mRequest.getParameter("reportSource")!=null||!"".equals(mRequest.getParameter("reportSource").trim()))  
            reportSource= Integer.parseInt(mRequest.getParameter("reportSource"));  
        String reporter= mRequest.getParameter("reporter");  
        String phone= mRequest.getParameter("phone");  
        String title= mRequest.getParameter("title");  
        String description= mRequest.getParameter("description");  
        if(mRequest.getParameter("longitude")!=null||!"".equals(mRequest.getParameter("longitude").trim()))  
            longitude= Double.parseDouble(mRequest.getParameter("longitude"));  
        if(mRequest.getParameter("latitude")!=null||!"".equals(mRequest.getParameter("latitude").trim()))  
            latitude= Double.parseDouble(mRequest.getParameter("latitude"));  

        Iterator<String> fns=mRequest.getFileNames();//获取上传的文件列表  
        while(fns.hasNext()){  
            String s =fns.next();  
            System.out.println(s+"==="+mRequest.getFile(s));  
//          System.out.println(mRequest.getFile(s));//get file success!!!!!  
            MultipartFile mFile = mRequest.getFile(s);    
            if(mFile.isEmpty()){  
                map.put("error", "EventAction.picture.failed");  
            }else{  
                String basePath=Constant.BASEPICUPLOADPATH;  
                String dPath= Constant.SDF_PARAM.format(new Date());  
                File dir = new File(basePath+dPath);  
                if(!dir.exists()){  
                    dir.mkdirs();  
                }  
                String originFileName=mFile.getOriginalFilename();  
                String suffix=originFileName.split("\\.")[originFileName.split("\\.").length-1];  
                String base64Name=UUID.randomUUID().toString();  
                File file =  new File(basePath+dPath,base64Name+"."+suffix);  
                try {  
                    FileUtils.copyInputStreamToFile(mFile.getInputStream(),file);//存储文件  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }    
            }  
        }  
        //System.out.println(mRequest.getFileNames());  
        map.put("result", "OK");//返回结果  
        return map;  
    }
  • 人来丶狗往

    我该咋使用呢.....好难理解

    2015-04-09 16:04

  • fer2005

    你是用的什么方式做的java后台?

    2015-04-09 16:05

  • fer2005

    基于什么框架?

    2015-04-09 16:05

  • 人来丶狗往

    回复 fer2005:没有用框架,我想写一个servlet,然后使用tomcat做容器.我是一个菜鸟,第一次接触文件上传这一块,这边前端的我都懂了,就是服务端比较难搞定

    2015-04-09 16:12

  • fer2005

    servlet的话,你就在doPost方法里写上我上面的那段代码就可以了

    2015-04-09 16:31

  • 人来丶狗往

    回复 fer2005:额,我先研究一下,不懂的话再请教你哈,谢谢你大神

    2015-04-09 16:53

  • 冰鱼

    前台页面怎么弄的,我用的springMVC,后台的file获取不到,不知道是不是前台页面格式不对

    2015-05-06 09:22

  • fer2005

    回复 冰鱼:前台页面不能用<input type='file'/>的方式写,得用html5+的plus.uploader.createUpload进行上传处理

    2015-05-07 16:39

  • 冰鱼

    回复 fer2005:好的,谢谢,我已经调试成功了

    2015-05-07 17:53

  • 黯淡星光

    struts框架代码咋弄呢。

    2015-05-20 13:01

  • fer2005

    Struts框架的应该跟spring是一样的,都是吧HttpServletRequest转成MultipartHttpServletRequest来实现

    2015-05-28 10:50

  • sunseine

    回复 黯淡星光:Struts2框架搞定了吗?分享下

    2015-05-29 17:09

  • Allen梅川酷子

    回复 黯淡星光:Struts2后台怎么获取文件的?求分享,谢谢!

    2015-07-05 10:52

  • 周海伦

    我也是用html5+的plus.uploader.createUpload,为什么程序一直返回是application/x-www-form-urlencoded了?MultipartHttpServletRequest这个对象也会一直报错

    2015-08-05 17:38

  • fer2005

    HTML5+的upload会发送两次请求,第一次的请求消息头为application/x-www-form-urlencoded,第二次才是真正的文件传输,所以需要如下处理:Map<String, Object> map = new HashMap<String, Object>();

    if(request.getHeader("content-type")!=null&&"application/x-www-form-urlencoded".equals(request.getHeader("content-type"))){

    return null;//此处直接返回null代表不支持断点续传

    }

    // System.out.println(request.getHeader("content-type"));


        MultipartHttpServletRequest mRequest=(MultipartHttpServletRequest)request;  

    //第二次请求时强制转换request

    Enumeration<String> ps = mRequest.getParameterNames();

    List<String> base64ParamNames=new ArrayList<String>();

    while(ps.hasMoreElements()){//根据参数名称获取上传文件内容

    String hname = ps.nextElement();

    System.out.println(hname);

    // System.out.println(mRequest.getParameter(hname));

    if(hname.startsWith("uploadBase")){

    base64ParamNames.add(hname);

    }

    }

    2015-08-12 13:56

  • 易网动力

    后台输出request.getHeader("content-type")是Multipart/form-data,但是MultipartHttpServletRequest 块还是报错....

    2015-11-01 23:02

  • 吃着炸鸡看球赛

    @75973 你好,请问要加载什么jar包吗,怎么我使用你的代码会报错呢。而且有好几处错误

    2015-11-28 10:21

  • xhq

    你好,struts接受addFile中的文件,接受不到呢?Iterator<String> fns=mRequest.getFileNames();

    2016-07-21 11:24

  • 5***@qq.com

    @1289733871@qq.com:你struts的弄好了 求分享

    2016-07-25 19:44

  • 1***@qq.com

    回复 fer2005:我也是用servlet写的,前台怎么调用呢plus.uploader.createUpload,sever写什么呢,写severlet接口,却进不到severlet方法里啊

    2017-03-10 15:08

  • 1***@qq.com

    回复 冰鱼:你好 请问你的Spring MVC 是怎么处理的

    2018-12-13 22:19

suixing

suixing

简单的net后台上传操作,核心代码如下:
context.Response.ContentType = "text/plain";

        string dirPath = context.Server.MapPath("~/Temp/");  
        if (!Directory.Exists(dirPath))  
        {  
            Directory.CreateDirectory(dirPath);  
        }  
        try  
        {  
            HttpFileCollection files = context.Request.Files;  
            if (files.Count > 0)  
            {  
                for (int i = 0; i < files.Count; i++)  
                {  
                    HttpPostedFile file = context.Request.Files[i];  
                    string filePath = dirPath + file.FileName + ".jpg";  

                    file.SaveAs(filePath);  
                }  
            }  
        }  
        catch (Exception e)  
        {  
            throw e;  
        }  

具体详见附件

人来丶狗往

人来丶狗往

对啊,有没有java服务端代码,求大神贡献一下,我这搞三天了,还是不可以

雪之梦技术驿站

雪之梦技术驿站 - 你在互联网的路上匆匆而来,雪之梦技术驿站助你满载而去

多张图片服务器只能接收到最后一张 服务器接收文件参数requesparamter(name=“file”)multipartFile file【】files 前台上传的图片key的name属性全为file

  • wm110

    我也遇到同样问题,请问你是怎么解决的

    2018-12-20 13:20

半杯可乐

半杯可乐 - 努力奋斗中。

有没有.net 方面的资料,我尝试了几种都 没有成功。

  • DCloud_heavensoft

    你问他,他做过.net上传。http://ask.dcloud.net.cn/people/%E5%BC%A0%E5%B7%A5

    2015-01-14 04:14

灯

c#

string dirPath = Server.MapPath("~/Temp/");
if (!Directory.Exists(dirPath))
{
Directory.CreateDirectory(dirPath);
}
string filePath = dirPath + DateTime.Now.ToString("yyyyMMddHHmmssffff") + ".jpg";
HttpPostedFileBase file = Request.Files[0];
file.SaveAs(filePath);

  • 豆豆xiao宽

    你好,我想问一下这段代码除了最后一句其余为什么会走两遍,是我前台代码的问题吗

    2015-03-13 09:17

  • suixing

    这是app中的请求模式,第一遍请求是检查是否支持断点续传,第二遍才是上传文件!

    2015-04-23 13:25

huiyichengyi

huiyichengyi

后台我用的是.net写的 我通过这种方式为什么拿不到上传的文件?我通过取Request集合中的Files文件集合拿的 拿到文件数量为0
HttpFileCollection MyFilecollection = Request.Files;
int cout = MyFilecollection.Count;
MyFilecollection[0].SaveAs(Server.MapPath("~/upload/" + MyFilecollection[0].FileName));
这种方式又不是有问题啊?

  • 安然恬淡

    问题解决了吗,能告诉我是怎么解决的吗

    2017-08-23 16:56

霸王

霸王

有没有ASP的啊

RyanCai

RyanCai

我的JAVA后台代码如下:

类头部设置的上传文件属性:
/**

  • RyanCai
  • 上传文件属性
    */
    private File picSearchfile; //上传的文件
    private String picSearchfileFileName; //文件名称
    private String picSearchfileContentType; //文件类型

方法体:

public void PicSelect() {  
    // 跨域访问设置作用域  
    setAccessControl();  
    // 获取用户输入的查询条件,并进行转码  
    Map<String, Object> map = new HashMap<String, Object>();  
    if (request.getHeader("content-type") != null  
            && "application/x-www-form-urlencoded".equals(request  
                    .getHeader("content-type"))) {  
        return;// 不支持断点续传,直接返回null即可  
    }  
    // 将请求转换成  
            String basePath = ServletActionContext.getServletContext()  
                    .getRealPath("/files/picsearch");// 获取服务器路径  
       if (picSearchfile != null) {  
            File savefile = new File(new File(basePath), picSearchfileFileName);  
            if (!savefile.getParentFile().exists())                  
                savefile.getParentFile().mkdirs();              
            try {  
                FileUtils.copyFile(picSearchfile, savefile);  
            } catch (IOException e) {    
                e.printStackTrace();     
            }  //备份文件  
       }  

    map.put("result", "OK");// 返回结果  
    JSONObject json = JSONObject.fromObject(map);  
    outString(json.toString());  
}  

基本上就相当于普通的struts2文件上传处理。

  • 1***@qq.com

    那这个前台是怎么调用的呢,那个sever对应php文件还需要么,咋修改呢

    2017-03-10 15:13

M522828

M522828

task.addFile("_doc/1456976109430.jpg",{key:"file"}); //手机中的图片

这样后台接收不到请求

task.addFile("img/1456976109430.jpg",{key:"file"});//项目中的图片

这样后台接能收到请求

@fer2005,后台用你的写法出现了上面奇怪的现象,什么情况?

文

struts2如何解析,哪位做出来了,指导一下

l***@sina.com

l***@sina.com

上传后前面会多出4行无用信息,自己处理掉后就可用了,这是我自己的处理方式,希望可以帮到大家。
File src = new File(rootPath+"\"+fileName+"."+postfix);
File tgt = new File(rootPath+"\"+fileName+"temp"+"."+postfix);
DataInputStream in = new DataInputStream(new FileInputStream(src));
DataOutputStream out = new DataOutputStream(new FileOutputStream(tgt));
String input = "";
int count = 0;
while ((input = in.readLine()) != null)
{
count++;
System.out.println(count);
if (count < 4)
{
System.out.println(input);
}
else
{
break;
}
}
byte[] buffer = new byte[1024];
int byteread = 0;
while ((byteread = in.read(buffer)) != -1)
{
out.write(buffer, 0, byteread);
}

        in.close();  
        out.close();  
        FileUtil.copy(tgt.getCanonicalPath(),src.getCanonicalPath(),true) ;  
        tgt.delete() ;
历练

历练

请问上传是什么方式,可以使用jquery的Ajax代替吗。一直上传后台resteasy报错,想换种方式

我是来学习的

我是来学习的

有没有前端那段上传的代码啊

l***@sina.com

l***@sina.com

JAVA CODE
MultiPartRequestWrapper mulReq = (MultiPartRequestWrapper) request;
File file = mulReq.getFiles("uploadImage")[0]
String filename = mulReq.getFileNames("uploadImage")[0];

HTML CODE
task.addFile(imgPath,{key:"uploadImage",name:imgname});

  • 8***@qq.com

    java具体怎么用啊,我试了试完全不能运行啊

    2020-03-09 12:04

i***@vip.qq.com

i***@vip.qq.com

@RequestMapping( "/fileUpload" )
public void fileUpload(@RequestParam ("file") MultipartFile fileUpload,HttpServletRequest request,HttpServletResponse response){
SimpleDateFormat sFormat = new SimpleDateFormat("yyyyMMddhhmmss" );
String fileName = sFormat.format(Calendar.getInstance().getTime())+ new Random().nextInt(1000);
String originalFilename = fileUpload.getOriginalFilename();
fileName += originalFilename.substring(originalFilename.lastIndexOf("." ));
String dirName = request.getSession().getServletContext().getRealPath("/" )+"fileUpload" ;
double originalFilesize = request.getContentLength();//获取源文件大小

     File file = new File(dirName);  
     InputStream inputStream = null ;  
     FileOutputStream outputStream = null ;  
      if (!file.exists()) {  
         file.mkdir();  
     }  
      try {  
         inputStream = fileUpload.getInputStream();  
          if (!inputStream.equals(null)){  
              try {  
            //处理存储过程  
                  System.out.println("dirName"+dirName+"...."+"originalFilesize"+originalFilesize);  

             } catch (Exception e) {  

                  e.printStackTrace();  
             }  
         }  
         outputStream = new FileOutputStream(dirName+"/" +fileName);  
          byte [] buffer = new byte[1024 * 1024];  
          int len=0;  
          while ((len=inputStream.read(buffer)) != -1){  
             outputStream.write(buffer, 0, len);  
             outputStream.flush();  
         }  
         outputStream.close();  
         inputStream.close();  
     }  
      catch (FileNotFoundException e){  
         e.printStackTrace();  
     }  
      catch (IOException e){  
         e.printStackTrace();  
     }  

   }  

////////////////
官方的uploader.html
42行把key:f.name 改成 key:"file"就行..跟@RequestParam ("file") 里面的file要一样
task.addFile(f.path,{key:"file"});

  • 9***@qq.com

    js代码怎么写??

    2017-05-02 17:40

  • 张张张啊

    请问你这个能上传多张吗

    2018-05-14 20:17

  • 张张张啊

    就算加上[] 也是实现不了上传多张

    2018-05-14 20:17

8***@qq.com

8***@qq.com

addData()的数据, PHP怎么接收

任

感谢

所谓

所谓

.net 后台
接收数据 string strClient = Request["client"];
接收文件
//客户端上传的文件集合
HttpFileCollection MyFilecollection = Request.Files;
for (int i = 0; i < MyFilecollection.Count; i )
{
HttpPostedFile FileInfo = MyFilecollection[i];
//FileInfo.FileName 是文件名
//FileInfo.SaveAs(filepath); 把图片保存到服务器路径
}

6***@qq.com

6***@qq.com - 90后码农

struts2 后台怎么接收啊,请大神指点一下

张张张啊

张张张啊 - 90后IT男

请问一下 java的 后台接受类型是 CommonsMultipartFile ,每次只能接受一张,不能多张。

此去经年

此去经年

nodejs的有吗

FxLsoft

FxLsoft

有没有java的

  • suixing

    还在研究中........

    2015-04-23 13:19

  • Allen梅川酷子

    回复 suixing:请问文件上传java后台怎么写的你弄好了吗?求分享啊!!

    2015-07-05 10:54

  • 于世海

    http://ask.dcloud.net.cn/article/545

    2016-02-17 11:51

  • l***@sina.com

    回复 Allen梅川酷子:JAVA CODE

    MultiPartRequestWrapper mulReq = (MultiPartRequestWrapper) request;

    File file = mulReq.getFiles("uploadImage")[0]

    String filename = mulReq.getFileNames("uploadImage")[0];


    HTML CODE

    task.addFile(imgPath,{key:"uploadImage",name:imgname});

    这样就可以啊

    2017-08-19 16:09

  • l***@sina.com

    回复 suixing:JAVA CODE

    MultiPartRequestWrapper mulReq = (MultiPartRequestWrapper) request;

    File file = mulReq.getFiles("uploadImage")[0]

    String filename = mulReq.getFileNames("uploadImage")[0];


    HTML CODE

    task.addFile(imgPath,{key:"uploadImage",name:imgname});

    2017-08-19 16:10

该问题目前已经被锁定, 无法添加新回复