Java通过图片URL把图片上传到本地服务器

13 篇文章 2 订阅
1 篇文章 0 订阅

Java通过图片URL把图片上传到本地服务器

在工作中通常有这么个需求:跟第三方对接数据,第三方给的图片数据只有一个url链接,这就导致我们访问图片资源要一直请求第三方的资源。万一第三方做了限制或者删除,就导致我们这边的图片资源访问不到了。这就需要我们把第三方的图片url实时转存到我们的服务器上,真正的实现资源自由

其实实现逻辑很简单:
①首先通过URL从HTTP响应获取资源
②然后把资源转成文件流
③最后以文件流的形式上传图片到服务器

话不多所,直接上Springboot代码👇👇👇

@RestController
@RequestMapping("/upload")
public class TestController {

    @GetMapping("/testUpload")
    public String testUpload(){
        try {
            //网络图片资源的url(可以把这个放参数中动态获取)
            String picUrl = "http://img1.gtimg.com/chinanba/pics/hv1/220/29/2326/151255765.jpg";
            //获取原文件名
            String fileName = picUrl.substring(picUrl.lastIndexOf("/")+1);
            //创建URL对象,参数传递一个String类型的URL解析地址
            URL url = new URL(picUrl);
            HttpURLConnection huc = (HttpURLConnection) url.openConnection();
            //从HTTP响应消息获取状态码
            int code = huc.getResponseCode();
            if (code == 200) {
                //获取输入流
                InputStream ips = huc.getInputStream();
                byte[] buffer = new byte[1024];
                int len = 0;
                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                while ((len = ips.read(buffer)) != -1) {
                    bos.write(buffer, 0, len);
                }
                bos.close();
                return uploadFileByBytes(bos.toByteArray(),fileName);
            }
            return "";
        } catch (Exception e) {
            return "";
        }
    }

    private String uploadFileByBytes(byte[] bytes, String fileName) throws Exception {
        for (int i = 0; i < bytes.length; i++) {
            if (bytes[i] < 0) {
                bytes[i] += 256;
            }
        }
        String realPath = System.getProperty("user.dir") + File.separator + "upload" + File.separator;
        //文件路径
        String url = realPath + fileName;
        //判断文件路径是否存在,如果没有则新建文件夹
        File files = new File(realPath);
        if(!files.exists()){
            files.mkdirs();
        }
        //把文件写入到指定路径下
        try(OutputStream out = new BufferedOutputStream(new FileOutputStream(url, false))){
            out.write(bytes);
        }
        return url;
    }
}

实现效果如下👇👇👇
请求访问
实现效果

  • 8
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
实现文件上传服务器本地,可以使用Java Servlet来处理上传请求,并使用Apache Commons FileUpload库来解析上传文件。以下是一个简单的示例代码: ```java import java.io.File; import java.io.IOException; 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; @WebServlet("/upload") public class FileUploadServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 检查是否为文件上传请求 if (!ServletFileUpload.isMultipartContent(request)) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Not a multipart request"); return; } // 创建文件上传对象 DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); try { // 解析上传文件 List<FileItem> items = upload.parseRequest(request); // 遍历所有上传文件 for (FileItem item : items) { // 忽略其他表单字段 if (!item.isFormField()) { // 获取上传文件的名称和类型 String fileName = item.getName(); String contentType = item.getContentType(); // 创建目标文件 File file = new File("/path/to/uploaded/files", fileName); // 将上传文件保存到本地 item.write(file); // 输出上传成功的信息 response.getWriter().println("File uploaded successfully: " + fileName); // 构造访问文件URL String fileUrl = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/uploaded/files/" + fileName; response.getWriter().println("File URL: " + fileUrl); } } } catch (Exception e) { // 处理上传异常 response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Error uploading file: " + e.getMessage()); } } } ``` 在上述代码中,我们首先检查请求是否为文件上传请求,然后创建一个`DiskFileItemFactory`对象和一个`ServletFileUpload`对象来解析上传文件。在遍历所有上传文件时,我们只处理文件类型的表单字段,忽略其他类型的字段。对于每个上传文件,我们创建一个目标文件并将其保存到本地。最后,我们构造一个URL来访问上传文件,并将其输出到响应中。 需要注意的是,上面示例中的路径"/path/to/uploaded/files"需要根据实际情况修改为你想要保存上传文件的目录。另外,为了能够通过URL访问上传文件,需要将上传文件保存到Web应用程序目录下的某个子目录中(在上述示例中为"/uploaded/files")。 如果你使用Maven管理Java项目,可以通过以下方式添加Apache Commons FileUpload库的依赖: ```xml <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency> ``` 这样就可以在Java中实现文件上传服务器本地,并通过URL访问了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值